Использование кодировки UTF-8 с PHP - требуются ли функции mb?
Последние несколько дней я работал над преобразованием моей базы PHP-кода из latin1 в UTF-8. Я прочитал два основных решения: либо заменить однобайтовые функции встроенными многобайтовыми функциями, либо установить значение mbstring.func_overload в файле php.ini.
Но затем я наткнулся на эту тему о переполнении стека, где публикация thomasrutter, кажется, указывает на то, что многобайтовые функции на самом деле не нужны для UTF-8, поскольку скрипт и строковые литералы кодируются в UTF-8.
Я не нашел никаких других доказательств, является ли это правдой или нет, и если окажется, что мне не нужно преобразовывать мой код в mb_functions, тогда это поможет сэкономить время! Кто-нибудь может пролить свет на это?
8 ответов
Насколько я понимаю проблему, пока все ваши данные на 100% в utf-8 - и это означает ввод данных пользователем, базу данных, а также кодирование самих файлов PHP, если у вас есть специальные символы в них - это правда верно для операций поиска и сравнения. Как указывает @ntd, не многобайтовая функция strlen() будет давать неправильные результаты при запуске строки, содержащей многобайтовые символы.
Это отличная статья об основах кодирования.
Они не являются "необходимыми", если вы не используете какую-либо функцию, которую они заменяют (и, скорее всего, вы используете хотя бы одну из них) или иным образом явно не нужна функция расширения, такая как обработка HTTP.
Работая над соответствием UTF-8, я всегда возвращаюсь к PHP UTF-8 Cheatsheet с одним дополнением: необходимо обновить шаблоны 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, я не вижу, как вы можете сделать это, используя обычный strlen()
,
Такие функции, как mb_strtoupper, также могут быть необходимы. strtoupper не будет конвертировать á в Á.
Существует ряд функций, которые ожидают, что строки будут однобайтовыми (а некоторые даже предполагают, что это iso-8859-1). В этих случаях вам необходимо знать, что вы делаете, и, возможно, использовать функции замены. Довольно полный список можно найти по адресу: http://www.phpwact.org/php/i18n/utf-8
Вы можете использовать библиотеку mbfunctions, которая расширяет многобайтовые функции в PHP:
Вы можете использовать эту настройку http://php.net/manual/en/mbstring.overload.php в файле php.ini, поэтому вам не нужно менять код.
Но будьте осторожны, потому что не все строковые функции будут автоматически изменены. Это один: http://php.net/manual/en/function.substr-replace.php