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

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

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

выходы

35
26

5 ответов


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

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


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

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


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

echo strlen("A B C D E F G H I")

чтобы распечатать 17-один байт на символ ASCII.

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


по данным этот пост на php.net/strlen, PHP интерпретирует все строки, переданные в strlen Как ASCII.


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