Использование кодировки UTF-8 с PHP - требуются ли функции mb? - PullRequest
5 голосов
/ 16 ноября 2009

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

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

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

Ответы [ 8 ]

10 голосов
/ 16 ноября 2009

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

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

4 голосов
/ 16 ноября 2009

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

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

3 голосов
/ 16 ноября 2009

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

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

2 голосов
/ 16 ноября 2009

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

1 голос
/ 16 ноября 2009

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

0 голосов
/ 22 декабря 2009

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

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

0 голосов
/ 22 декабря 2009

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

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

...