Fluxo de trabalho UTF8 PHP, MySQL resumido [closed]

Eu estou trabalhando para clientes internacionais que têm alfabetos muito diferentes e então estou tentando finalmente obter uma visão geral de um fluxo de trabalho completo entre PHP e MySQL que assegure que todas as codificações de caracteres sejam inseridas corretamente. Eu li um monte de tutoriais sobre isso, mas ainda tenho dúvidas (há muito a aprender) e pensei que eu poderia colocar tudo junto aqui e perguntar.

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>

(embora o posterior seja opcional e sim uma sugestão, mas acredito que prefiro sugerir como não fazer nada)

MySQL

CREATE database_name DEFAULT CHARACTER SET utf8; ouALTER database_name DEFAULT CHARACTER SET utf8; e / ou usarutf8_general_ci como agrupamento de conexão MySQL.

(isto éimportante notar aqui que isso aumentará o tamanho do banco de dados se ele usar varchar)

Conexão

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

Lógica de negócios

detectar se não for UTF8 commb_detect_encoding() e converter comivon().
validando sequências excessivamente longas de UTF8 e 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);

Questões

émb_internal_encoding('UTF-8') necessário no PHP 5.3 e superior e se assim for, isso significa que eu tenho que usar todas as funções multi byte em vez de suas funções principais comomb_substr() ao invés desubstr()?

ainda é necessário verificar se há picadas de entrada malformadas e, em caso afirmativo, qual é uma função / classe confiável para fazer isso? Eu possivelmente não quero remover dados ruins e não sei o suficiente sobre transliteração.

deveria ser realmenteutf8_general_ci ou melhorutf8_bin?

Há algo faltando no fluxo de trabalho acima?

fontes:

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