Длина строк в Юникоде различна - PullRequest
7 голосов
/ 24 сентября 2011

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

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

Выходы

35
26

Ответы [ 5 ]

10 голосов
/ 24 сентября 2011

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

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

9 голосов
/ 24 сентября 2011

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

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

2 голосов
/ 24 сентября 2011

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

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

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

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

1 голос
/ 24 сентября 2011

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

1 голос
/ 24 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...