PHP iconv strlen () означает вопрос


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

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

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 8

4 ответа:

Возьмем, к примеру, японский иероглиф "こ". Предполагая кодировку 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. Вот в чем дело это объяснение предназначено для того, чтобы указать.

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

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

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

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

Переводы:

  • byte sequence: другое слово для строки, представляющей собой последовательность байтов (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() подсчитывает символы в данной строке с учетом набора символов. Поэтому количество символов может быть не равно количеству байтов.