Как получилось, что длина следующих строк отличается, хотя количество символов в строках одинаково
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