Использование кодировки 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/
Ответ 8
Вы можете использовать это
http://php.net/manual/en/mbstring.overload.php
в файле php.ini, поэтому вам не нужно менять код.
Но будьте осторожны, потому что не все строковые функции будут автоматически изменены.
Это одно: http://php.net/manual/en/function.substr-replace.php