Длина строк в 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