Использование кодировки UTF-8 с PHP - нужны ли функции mb?

В последние несколько дней я работал над преобразованием базы PHP-кода с latin1 на UTF-8. Я прочитал два основных решения: либо заменить одиночные байтовые функции на встроенные многобайтовые функции, либо установить значение mbstring.func_overload в файле php.ini.

Но потом я наткнулся на этот поток при переполнении стека, где сообщение thomasrutter, похоже, указывает, что многобайтовые функции на самом деле не нужны для UTF-8, пока script и строковые литералы закодированы в UTF-8.

Я не нашел никаких других доказательств того, является ли это правдой или нет, и если окажется, что мне не нужно преобразовывать мой код в mb_functions, тогда это будет заставка в реальном времени! Любой, кто может пролить свет на это?

Ответ 1

Насколько я понимаю, до тех пор, пока все ваши данные 100% в utf-8, и это означает, что пользовательский ввод, база данных, а также кодирование самих файлов PHP, если у вас есть специальные символы, это true true для операций поиска и сравнения. Как указывает @ntd, non-multibyte strlen() приведет к неправильным результатам при запуске строки, содержащей многобайтовые символы.

Это - отличная статья об основах кодирования.

Ответ 2

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

При работе в соответствии с UTF-8 я всегда возвращаюсь к PHP UTF-8 Cheatsheet с одним дополнением: шаблоны PCRE должны обновляться, чтобы использовать модификатор u.

Ответ 3

Как только вы изучаете или изменяете многобайтовую строку, вам нужно использовать функцию mb_ *. Очень быстрый пример, который показывает, почему:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

Это выдает:

strlen: 20
mb_strlen: 13

Ответ 4

thomasrutter указывает, что поиск не требует специальной обработки. Например, если вам нужно проверить длину строки UTF8, я не вижу, как вы можете это сделать, используя plain strlen().

Ответ 5

Также могут потребоваться такие функции, как mb_strtoupper. strtoupper не будет преобразовывать á в Á.

Ответ 6

Существует ряд функций, которые ожидают, что строки будут одиночными байтами (И некоторые даже предполагают, что это iso-8859-1). В этих случаях вам нужно знать, что вы делаете, и, возможно, использовать функции замены. Существует довольно обширный список по адресу: http://www.phpwact.org/php/i18n/utf-8

Ответ 7

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

http://code.google.com/p/mbfunctions/