UTF8 рабочий процесс PHP, MySQL подытожил [закрыто]
Я работаю для международных клиентов, у которых все очень разные алфавиты, и поэтому я пытаюсь наконец получить представление о полном рабочем процессе между PHP и MySQL, который обеспечил бы правильную вставку всех кодировок символов. Я прочитал кучу уроков по этому вопросу, но у меня все еще есть вопросы (есть чему поучиться), и я подумал, что я мог бы просто собрать все это здесь и спросить.
PHP
header('Content-Type:text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');
HTML
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<form accept-charset="UTF-8"> .. </form>
(though the later is optional and rather a suggestion but I belief I'd rather suggest as not doing anything)
MySQL
CREATE database_name DEFAULT CHARACTER SET utf8;
или жеALTER database_name DEFAULT CHARACTER SET utf8;
и / или использоватьutf8_general_ci
как сопоставление соединения MySQL.
(it is важно отметить здесь, что это увеличит размер базы данных, если он использует varchar)
Connection
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");
Businesses logic
определить, если не UTF8 сmb_detect_encoding()
и конвертировать сivon()
.
проверка чрезмерно длинных последовательностей UTF8 и UTF16
$body=preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]|(?<=^|[\x00-\x7F])[\x80-\xBF]+|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/','�',$body);
$body=preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $body);
Questions
is mb_internal_encoding('UTF-8')
necessary in PHP 5.3 and higher and if so does this mean I have to use all multi byte functions instead of its core functions like mb_substr()
instead of substr()
?
is it still necessary to check for malformed input stings and if so what is a reliable function/class to do so? I possibly do not want to strip bad data and don't know enough about transliteration.
should it really be utf8_general_ci
or rather utf8_bin
?
is there something missing in the above workflow?
источники:
http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/
http://webcollab.sourceforge.net/unicode.html
http://stackoverflow.com/a/3742879/1043231
http://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/
http://akrabat.com/php/utf8-php-and-mysql/