PHP iconv_strlen () означает вопрос - PullRequest
8 голосов
/ 22 мая 2011

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

А что такое последовательность байтов?А сколько символов в байте?

iconv_strlen() counts the occurrences of characters in the given byte sequence str on the basis of the specified character set, the result of which is not necessarily identical to the length of the string in byte.

Ответы [ 4 ]

12 голосов
/ 22 мая 2011

Давайте возьмем, к примеру, японский символ «こ». Предполагая кодировку UTF-8, это 3-байтовый символ (0xE3 0x81 0x93). Давайте посмотрим, что произойдет, когда мы используем strlen вместо:

$ php -r 'echo strlen("こ") . "\n";'
3

Результат равен 3, поскольку strlen считает байты. Тем не менее, это только один символ в соответствии с кодировкой UTF-8. Вот тут и приходит iconv_strlen. Он знает, что в UTF-8 это одиночный символ, хотя он состоит из 3 байтов. Так что, если мы попробуем это вместо:

$ php -r 'echo iconv_strlen("こ", "UTF-8") . "\n";'
1

Мы получаем 1. Вот что означает это объяснение.

1 голос
/ 22 мая 2011

Строка имеет определенную длину в байтах. Количество символов в этой строке будет равно количеству байтов тогда и только тогда, когда каждый символ в строке представлен одним байтом . Это верно, например, для английских букв. Для представлений (то есть кодировок), которые используют более одного байта для представления некоторых или всех символов, количество символов будет меньше количества байтов *. Например, невозможно представить все возможные китайские символы в байтах.

Итак, iconv_strlen, учитывая кодировку, попытается посчитать количество символов в строке. Последовательность байтов - это порядок байтов в строке. Для строки, содержащей китайский, с использованием кодировки UTF8, вы можете, например, иметь 20-байтовую строку, содержащую 14 символов.

* Может быть больше, если символ представлен менее чем одним байтом.

0 голосов
/ 22 мая 2011

iconv_strlen() считает количество символов в данной последовательности байтов str на основе указанного набора символов, результат которого не обязательно совпадает с длиной строки в байте.

Переводы:

  • byte sequence: другое слово для string , которое представляет собой последовательность байтов (1 байт = 8 бит), например: 01011010 00011001 01101011. Последовательности байтов представляют символов, таких как A, B, C и т. Д.
  • character set: a.k.a. кодировка , указывает, как байт отображается на символ; например 01000001 представляет A в кодировке ASCII .
  • not necessarily identical to the length […] in byte: в наборе символов ASCII один байт представляет ровно один символ. Это не относится ко всем наборам символов; в некоторых два, три или более байтов используются для представления одного символа. Это связано с тем, что один байт может содержать только 256 различных значений, а некоторые языки написаны с использованием более 256 символов (например, китайский и японский). Unicode даже пытается отобразить все символы всех человеческих языков в одном наборе символов, который требует намного больше, чем один байт на символ.

В итоге:

iconv_strlen() считает символы в данной строке с учетом набора символов. Следовательно, количество символов не может быть равно количеству байтов.

...