Estoy trabajando para clientes internacionales que tienen alfabetos muy diferentes y estoy tratando de obtener finalmente una visión general de un flujo de trabajo completo entre PHP y MySQL que asegure que todas las codificaciones de caracteres se inserten correctamente. He leído un montón de tutoriales sobre esto, pero todavía tengo preguntas (hay mucho que aprender) y pensé que podría simplemente poner todo junto aquí y preguntar.Flujo de trabajo UTF8 PHP, MySQL resume
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>
(aunque este último es opcional y más bien una sugerencia, pero yo prefiero la creencia sugiere que no hacer nada)
MySQL
CREATE database_name DEFAULT CHARACTER SET utf8;
o ALTER database_name DEFAULT CHARACTER SET utf8;
y/o use utf8_general_ci
como MySQL intercalación conexión.
(es important to note aquí que esto aumentará el tamaño de la base de datos si se utiliza varchar)
conexión
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");
empresas lógica
detectar si no UTF8 con mb_detect_encoding()
y convierta con ivon()
.
validar excesivamente largas secuencias de UTF8 y 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);
Preguntas
se ofrecen
mb_internal_encoding('UTF-8')
necesaria en PHP 5.3 y superior y si es así ¿significa que tiene que usar todas las funciones de varios bytes en vez de sus funciones principales comomb_substr()
en lugar desubstr()
?¿Sigue siendo necesario verificar si hay picaduras de entrada mal formadas y, en caso afirmativo, cuál es una función/clase confiable para hacerlo? Posiblemente no quiero quitar datos malos y no sé lo suficiente sobre transliteración.
¿debería ser realmente
utf8_general_ci
o más bienutf8_bin
?¿falta algo en el flujo de trabajo anterior?
fuentes:
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/
bien, entonces la pregunta es? –
lo siento, tuve problemas para publicar esta pregunta, ya que parece que stackoverflow confunde parte de mi URL de origen como código y arroja un error .... funciona ahora ... – Dominik
mb_internal_encoding ('UTF-8') es necesario si mb_internal_encoding() result es distinto de UTF-8. –