Длина строк в unicode различна

Как получилось, что длина следующих строк отличается, хотя количество символов в строках одинаково

echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>"; echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>"; 

Выходы

 35 26 

Первая партия символов занимает три байта каждый, потому что они отстают от 39-тысячного символьного списка, тогда как вторая группа берет только по два байта, что составляет около 400. (Количество байтов / октетов, требуемых для каждого характер обсуждаются в статье Википедии UTF-8 .)

strlen подсчитывает количество байтов, полученных строкой, что дает такие нечетные результаты в Unicode.

Я не эксперт по PHP, но кажется, что strlen подсчитывает байты … есть mb_strlen который подсчитывает символы …

EDIT – для дополнительной информации о том, как работает многобайтовая кодировка, см. http://en.wikipedia.org/wiki/Variable-width_encoding и особенно. UTF8 см. http://en.wikipedia.org/wiki/UTF-8 и

Похоже, он подсчитывает количество байтов в используемой кодировке. Например, похоже, что вторая строка принимает два байта на не-пробельный символ, тогда как первая строка принимает три байта на не-пробельный символ. Я бы ожидал:

 echo strlen("ABCDEFGHI") 

для печати 17 – один байт на символ ASCII.

Я предполагаю, что все это использует кодировку UTF-8, которая, несомненно, будет соответствовать разной ширине представления.

Согласно этому сообщению на php.net/strlen , PHP интерпретирует все строки, переданные в strlen как ASCII.

Используйте mb_strlen , он подсчитывает символы в предоставленной кодировке, а не байты как strlen