Przepływ pracy UTF8 PHP, MySQL podsumowane [zamknięte]

Pracuję dla międzynarodowych klientów, którzy mają wszystkie bardzo różne alfabety, więc staram się w końcu uzyskać przegląd pełnego przepływu pracy między PHP i MySQL, który zapewniłby prawidłowe kodowanie wszystkich znaków. Przeczytałem kilka tutoriali na ten temat, ale wciąż mam pytania (jest wiele do nauczenia) i pomyślałem, że mogę to wszystko położyć tutaj i zapytać.

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>

(choć późniejsze jest opcjonalne i raczej sugestią, ale wierzę, że wolałbym raczej sugerować, że nic nie robię)

MySQL

CREATE database_name DEFAULT CHARACTER SET utf8; lubALTER database_name DEFAULT CHARACTER SET utf8; i / lub użytkowaniautf8_general_ci jako zestawianie połączeń MySQL.

(to jestważne, aby pamiętać tutaj zwiększy to rozmiar bazy danych, jeśli używa varchar)

Połączenie

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");

Logika firm

wykryć, jeśli nie UTF8 zmb_detect_encoding() i nawróć się zivon().
sprawdzanie zbyt długich sekwencji UTF8 i 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);

pytania

jestmb_internal_encoding('UTF-8') konieczne w PHP 5.3 i nowszych, a jeśli tak, to znaczy, że muszę używać wszystkich funkcji wielobajtowych zamiast podstawowych funkcjimb_substr() zamiastsubstr()?

czy nadal konieczne jest sprawdzenie zniekształconych żądań wejściowych, a jeśli tak, to co jest niezawodną funkcją / klasą? Prawdopodobnie nie chcę usuwać złych danych i nie wiem wystarczająco dużo o transliteracji.

czy naprawdę tak powinno byćutf8_general_ci albo raczejutf8_bin?

czy czegoś brakuje w powyższym przepływie pracy?

źródła:

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/  

questionAnswers(2)

yourAnswerToTheQuestion