Я хотел бы убедиться, что все, что я знаю о UTF-8, является правильным. Я пытаюсь использовать UTF-8 некоторое время, но я продолжаю спотыкаться о все больше и больше ошибок и других странных вещей, из-за которых почти невозможно иметь 100% -ный сайт UTF-8. Где-то всегда есть что-то, что я, кажется, пропущу. Возможно, кто-то здесь может исправить мой список или ОК, поэтому я не пропущу ничего важного.
База данных
Каждый сайт должен где-то хранить данные. Независимо от ваших настроек PHP вы также должны настроить БД. Если вы не можете получить доступ к файлам конфигурации, убедитесь, что как только вы подключитесь, " УСТАНОВИТЬ НАЗВАНИЯ" utf8 ". Кроме того, не забудьте использовать utf8_ unicode_ ci для всех ваших таблиц. Это предполагает MySQL для базы данных, вам придется изменить для других.
Regex
Я делаю LOT регулярного выражения более сложный, чем ваш средний поиск. Я должен помнить, чтобы использовать модификатор "/u", чтобы PCRE не искажает мои строки. Тем не менее, даже тогда есть все еще проблемы, видимо,.
Строковые функции
Все строковые функции по умолчанию (strlen(), strpos() и т.д.) должны быть заменены на Многобайтовые строковые функции, которые выглядят в символе вместо байта.
Заголовки Вы должны убедиться, что ваш сервер возвращает правильный заголовок для браузера, чтобы узнать, какую кодировку вы пытаетесь использовать (точно так же, как вы должны сообщить MySQL).
header ('Content-Type: text/html; кодировка = UTF-8' );
Также неплохо поставить правильную <meta> в заголовке страницы. Хотя фактический заголовок будет отменять это, если они будут отличаться.
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Вопросы
Нужно ли мне конвертировать все, что я получаю от пользовательского агента (HTML-форма и URI) в UTF-8, когда загружается страница, или если я могу просто оставить строки/значения так, как они есть, и по-прежнему запускать их через эти функции без проблем?
Если мне нужно преобразовать все в UTF-8, то какие шаги я должен предпринять? mb_detect_encoding, похоже, для этого построено, но я все вижу, что люди жалуются, что он не всегда работает. mb_check_encoding также, похоже, проблема, говорящая о хорошей строке UTF-8 из искаженной.
Сохраняет ли PHP строки в памяти по-разному в зависимости от того, какую кодировку он использует (например, типы файлов), или он все еще хранится как обычное жало, причем некоторые из символов интерпретируются по-разному (например, vs и in HTML). chazomaticus отвечает на этот вопрос:
В PHP (до PHP5, во всяком случае), строки это просто последовательности байтов. Там есть не подразумеваемый или явный набор символов связанные с ними; это что-то программист должен отслеживать.
Если a дать строку non-UTF-8 функции mb_ *, она когда-нибудь вызовет проблему?
Если строка UTF неправильно закодирована, что-то пойдет не так (например, ошибка синтаксического анализа в регулярном выражении?) или она просто пометит объект как плохой (html)? Есть ли вероятность, что неправильно закодированные строки приведут к возврату функции FALSE, потому что строка плохая?
Я слышал, что вы также должны указывать свои формы как UTF-8 (accept-charset = "UTF-8" ), но я не уверен, что это преимущество..?
Был ли написан UTF-16 для ограничения лимита в UTF-8? Как UTF-8 заканчивается для символов? (У2 (UTF) K & alpha;)
Функции
Вот пара пользовательских функций PHP, которые я нашел, но у меня нет никакого способа проверить, что они действительно работают. Возможно, у кого-то есть пример, который я могу использовать. Сначала convertToUTF8(), а затем seem_utf8 из wordpress.
function seems_utf8($str) {
$length = strlen($str);
for ($i=0; $i < $length; $i++) {
$c = ord($str[$i]);
if ($c < 0x80) $n = 0; # 0bbbbbbb
elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
else return false; # Does not match any model
for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}
Если кому-то интересно, я нашел отличную страницу примеров, чтобы использовать при тестировании UTf-8.