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

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

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

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

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

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

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

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

Как только вы изучаете или изменяете многобайтовую строку, вам нужно использовать функцию 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 

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

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

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

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

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

Вы можете использовать этот параметр http://php.net/manual/en/mbstring.overload.php в файле php.ini, поэтому вам не нужно менять код.

Но будьте осторожны, потому что не все строковые функции будут автоматически изменены. Это одно: http://php.net/manual/en/function.substr-replace.php