Вопрос по mysql, workflow, unicode, php, utf-8 – UTF8 рабочий процесс PHP, MySQL подытожил [закрыто]

7

Я работаю для международных клиентов, у которых все очень разные алфавиты, и поэтому я пытаюсь наконец получить представление о полном рабочем процессе между 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/  
извините, я изо всех сил пытался опубликовать этот вопрос, поскольку кажется, что stackoverflow ошибочно принимает часть моего исходного URL-адреса в виде кода и выдает ошибку .... работает сейчас ... Dominik
ок, вопрос такой? Mihai Iorga
mb_internal_encoding («UTF-8») необходим, если результат mb_internal_encoding () отличается от UTF-8. user1202495

Ваш Ответ

2   ответа
1

Вы должны использовать utf8_bin дляCase-sensitive поиск, иначе utf8_general_ci

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()?

Да, конечно, если у вас есть многобайтовая строка, вам нужна семейная функция mb_ *, за исключением бинарной безопасной php-функции типа str_replace (); (и несколько других)

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.

Хм, нет, вы не можете это проверить.

2-й и 3-й пункты не являются реалистичными. Второй момент зависит от того, что «фильтрует» о ... вы все еще можете сделать(int)$_GET['utf8var'], например. Строковые функции PHP являются бинарными. Если вы не все испортили,str_replace() и семья все еще работает (за исключением псевдонима UTF8).
6
mb_internal_encoding('UTF-8') doesn't do anything by itself, it only sets the default encoding parameter for each mb_ function. If you're not using any mb_ function, it doesn't make any difference. If you are, it makes sense to set it so you don't have to pass the $encoding parameter each time individually. IMO mb_detect_encoding is mostly useless since it's fundamentally impossible to accurately detect the encoding of unknown text. You should either know what encoding a blob of text is in because you have a specification about it, or you need to parse appropriate meta data like headers or meta tags where the encoding is specified. Using mb_check_encoding to check if a blob of text is valid in the encoding you expect it to be in is typically sufficient. If it's not, discard it and throw an appropriate error.

does this mean I have to use all multi byte functions instead of its core functions

If you are manipulating strings that contain multibyte characters, then yes, you need to use the mb_ functions to avoid getting wrong results. The core string functions only work on a byte level, not a character level, which is what you typically want when working with strings.

utf8_general_ci vs. utf8_bin only makes a difference when collating, i.e. sorting and comparing strings. With utf8_bin data is treated in binary form, i.e. only identical data is identical. With utf8_general_ci some logic is applied, e.g. "é" sorts together with "e" and upper case is considered equal to lower case.

Похожие вопросы