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

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

5 ответов


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

с Многобайтовая Строка Введение:

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


вот мой ответ на простом английском языке. Один японский, китайский и корейский иероглиф занимает более одного байта. Например. типичный charactert сказать x занимает 1 байт на английском это займет больше, чем 1 байт на японском, китайском и корейском языках. Теперь стандартные строковые функции PHP предназначены для обработки одного символа как 1 байта. Поэтому, если вы пытаетесь сравнить два японских, китайских или корейских символа, они не будут работать так, как ожидалось. Например, длина - Привет, Мир!"на японском, китайском или корейском языке будет более 12 байт.

читать http://www.php.net/manual/en/intro.mbstring.php


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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

резюме:

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

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


multibyte => multi + byte.

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

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

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

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