Зачем использовать многобайтовые строковые функции в PHP?

На данный момент я не понимаю, почему очень важно использовать функции mbstring в PHP при работе с UTF-8? Моя локаль под linux уже установлена ​​в UTF-8, поэтому почему функции, такие как strlen , preg_replace и т. Д., Не работают по умолчанию?

Все строковые функции PHP не обрабатывают многобайтовые строки независимо от локали вашей операционной системы. Вот почему вам нужно использовать многобайтовые строковые функции.

Из многобайтовой строки Введение :

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

Люди здесь не понимают UTF-8.

Вам не нужно использовать код UTF-8 для обработки UTF-8. По большей части.

Я даже написал верхний лабиринт / нижний лайнер Unicode, а также NFC и NFD, используя только байт-функции. Трудно думать о чем-то более сложном, чем это требует такой деликатной и детальной обработки UTF-8. И все же он по-прежнему работает с байт-функциями.

Очень редко вам нужен код UTF-8. Возможно, чтобы подсчитать количество символов или переместить точку вставки вперед на 1 символ. Но на самом деле, даже тогда ваш код не будет работать;) из-за разложенных символов.

Но если все, что вы делаете, это замена, поиск материала или синтаксический синтаксический анализ, вам понадобятся только байт-функции.

Я объясню, почему.

Это потому, что символ UTF-8 не найден внутри любого другого символа UTF-8. Вот как он разработан.

Попытайтесь объяснить мне, как вы можете получить ошибки обработки текста в терминах многобайтовой системы, где ни один символ не может быть найден внутри другого символа? Только один пример! Самое простое, о чем вы можете подумать.

Вот мой ответ на простом английском языке. Один японский и китайский и корейский персонажи принимают более одного байта. Например, типичный символ, где x принимает 1 байт на английском, он будет принимать более 1 байт на японском и китайском и корейском языках. Теперь стандартные строковые функции PHP предназначены для обработки одного символа как 1 байт. Поэтому, если вы пытаетесь сравнить двух японских или китайских или корейских персонажей, они не будут работать должным образом. Например, длина «Hello World!» на японском или китайском или корейском языках будет иметь более 12 байт.

Читайте http://www.php.net/manual/en/intro.mbstring.php

multibyte => multi + байт.

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

2) Строковые функции PHP по умолчанию работают только с английским языком (или переименованы).

3) Если вы хотите использовать strlen () или strpos () или uppercase () или strreplace () для специального символа,
Предположим, нам нужно применить строковые функции в «Hello».
В китайском (你好), арабском (مرحبا), японском (こ ん に ち は), хинди (नमस्ते), Гуджарати (હેલો).
На другом языке могут быть собственные наборы символов

так что mbstring введен для общения с различными языками, такими как (chines, Japanese и т. д.).

Строки PHP – это просто байтовые последовательности. Они не имеют никакого значения сами по себе. И они не используют никакой конкретной кодировки символов.

Поэтому, если вы читаете файл с помощью file_get_contents() вы получаете двоично-безопасное представление файла. Пусть это будет (двоичное) представление изображения или текстового файла, читаемого человеком – PHP не волнует.

Теперь, пока вам просто нужно выполнить базовую обработку строки, вам вообще не нужно знать кодировку символов. Поэтому, если вы хотите сохранить строку обратно в файл с помощью file_put_contents() или хотите получить ее длину ( не количество символов ) с помощью strlen() , вы в порядке.

Однако, как только вы начинаете делать более причудливые манипуляции с строкой, вам нужно знать кодировку символов ! Невозможно сохранить его как часть строки, поэтому вам нужно либо отследить его отдельно, либо, что большинство людей, используют соглашение о наличии всех (текстовых) строк в общей кодировке символов, например US-ASCII или в настоящее время UTF-8 .

Поэтому, поскольку нет способа задать кодировку символов для строки, PHP не знает, какой символ кодирует строка . Из-за этого единственной разумной strlen() для strlen() является возвращение количества байтов, поскольку это единственное, что знает PHP точно.

Если вы предоставите дополнительную информацию о используемой кодировке символов, вам нужно использовать другую функцию – в этом случае функция называется mb_strlen() .

То же самое относится к preg_replace() : если вы хотите заменить umlaut-a или сопоставить три одинаковых символа в строке, вам нужно знать, как кодируется umlaut-a, и вообще, как кодируются символы.

Итак, если у вас есть гипотетическая кодировка символов, которая кодирует нижний регистр a как a1 и верхний регистр A как a2 , a b как b1 и B как b2 (и так далее), вы можете иметь (закодированную) строку a1a1a1 который состоит из трех одинаковых символов в строке. Однако, не зная кодировки и просто глядя на последовательность байтов, нет способа обнаружить это.

Резюме:

Нет смысла использовать «по умолчанию», поскольку строки PHP не содержат кодировку символов. И даже если одна функция, такая как strlen() не может вернуть длину последовательности байтов, как требуется для HTTP-заголовка Content-Length и в то же время количество символов, полезных для обозначения длины статьи в блоге.

Именно поэтому функция перегрузки функций по своей сути нарушена, и даже если она выглядит вначале хорошо, она сломает ваш код в трудно отлаживаемом виде.