UTF8 Workflow PHP, MySQL zusammengefasst [geschlossen]

Ich arbeite für internationale Kunden mit sehr unterschiedlichen Alphabeten und versuche, endlich einen Überblick über einen vollständigen Workflow zwischen PHP und MySQL zu bekommen, der sicherstellt, dass alle Zeichenkodierungen korrekt eingefügt werden. Ich habe eine Reihe von Tutorials dazu gelesen, habe aber noch Fragen (es gibt viel zu lernen) und dachte, ich könnte hier einfach alles zusammenstellen und fragen.

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>

(obwohl das letztere optional und eher ein Vorschlag ist, aber ich glaube, ich würde eher vorschlagen, nichts zu tun)

MySQL

CREATE database_name DEFAULT CHARACTER SET utf8; oderALTER database_name DEFAULT CHARACTER SET utf8; und / oder verwendenutf8_general_ci als MySQL-Verbindungssortierung.

(es istwichtig zu beachten hier, dass dies die Datenbankgröße erhöht, wenn es varchar verwendet)

Verbindung

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

Geschäftslogik

erkenne ob nicht UTF8 mitmb_detect_encoding() und konvertieren mitivon().
Überprüfung zu langer Sequenzen von UTF8 und 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);

Fragen

istmb_internal_encoding('UTF-8') notwendig in PHP 5.3 und höher und wenn ja, muss ich alle Multi-Byte-Funktionen anstelle seiner Kernfunktionen wie verwendenmb_substr() anstattsubstr()?

Muss noch nach fehlerhaften Eingabestichen gesucht werden und wenn ja, welche Funktion / Klasse ist dafür zuverlässig? Ich möchte möglicherweise keine schlechten Daten entfernen und weiß nicht genug über Transliteration.

sollte es wirklich seinutf8_general_ci oder eherutf8_bin?

Fehlt im obigen Workflow etwas?

Quellen:

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/  

Antworten auf die Frage(2)

Ihre Antwort auf die Frage