我正在为拥有不同字母表的国际客户工作,因此我试图最终了解 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>
(虽然后者是可选的,而是一个建议,但我相信我宁愿建议不做任何事情)
MySQL
CREATE database_name DEFAULT CHARACTER SET utf8;
or ALTER database_name DEFAULT CHARACTER SET utf8;
和/或使用utf8_general_ci
作为 MySQL 连接排序规则。
(it is 重要的是要注意如果使用 varchar,这会增加数据库大小)
联系
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");
商业逻辑
检测是否不是 UTF8mb_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);
问题
is mb_internal_encoding('UTF-8')
在 PHP 5.3 及更高版本中是必需的,如果是这样,这是否意味着我必须使用所有多字节函数而不是其核心函数,例如mb_substr()
代替substr()
?
是否仍然需要检查格式错误的输入字符串,如果需要,什么是可靠的函数/类来执行此操作?我可能不想删除坏数据并且对音译了解不够。
真的应该是吗utf8_general_ci
更确切地说utf8_bin
?
上述工作流程中是否缺少某些内容?
来源:
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/