UTF8工作流程PHP,MySQL的总结[关闭](UTF8 workflow PHP, MySQL

2019-06-25 11:22发布

我的工作谁拥有所有非常不同的字母,因此我想最终得到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;ALTER database_name DEFAULT CHARACTER SET utf8; 和/或使用utf8_general_ci如MySQL连接核对。

(这是需要注意的重要位置,这将增加数据库的大小,如果它使用VARCHAR)

连接

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

业务逻辑

检测如果不使用UTF8 mb_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);

问题

  • 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/  

Answer 1:

  • mb_internal_encoding('UTF-8')本身并不做任何事情,它只是设定每个默认编码参数mb_功能。 如果你不使用任何mb_功能,它没有任何区别。 如果你是,是有意义的设置,所以你不必通过$encoding每一次单独的参数。
  • IMO mb_detect_encoding是大多无用,因为它根本不可能准确地检测未知文本的编码。 您应该知道什么编码的文本的BLOB是因为你有一个规范它,或者你需要分析类似的报头或在指定的编码的meta标签适当的元数据。
  • 使用mb_check_encoding检查文本的斑点是否是你希望它是在编码有效期通常是足够的。 如果不是,丢弃它并引发相应的错误。
  • 关于:

    这是否意味着我必须使用的,而不是它的核心功能全方位多字节功能

    如果您想在包含多字节字符的字符串,然后是,你需要使用mb_功能,以避免收到错误的结果。 核心字符串函数只能在字节级,而不是人物等级,这是您通常希望用字符串时工作。

  • utf8_general_ciutf8_bin 整理 ,即排序和比较字符串时,只有有差别。 与utf8_bin数据以二进制形式进行处理,即,仅相同的数据是相同的。 与utf8_general_ci一些逻辑应用于,例如,“E”与排序“e”和上壳体一起被认为等于为小写。


Answer 2:

它应该是utf8_general_ci或者说utf8_bin?

您必须使用utf8_bin 区分大小写的搜索,否则utf8_general_ci

是mb_internal_encoding必要在PHP 5.3及以上,如果(“UTF-8”),那么,这是否意味着我必须使用所有多字节的功能,而不是它的核心功能,如mb_substr()而不是SUBSTR()?

是的,当然,如果你有一个多字节字符串你需要MB_ *家庭功能一起工作,除了像str_replace函数二进制安全PHP的标准功能(); (和其他几个人)

它仍然需要检查对错误输入蜇伤如果是这样,什么是可靠的函数/类这样做呢? 我可能不想要去除坏的数据,不知道有足够的了解音译。

嗯,没有你不能检查。



文章来源: UTF8 workflow PHP, MySQL summarized [closed]