经常出现这样的字符,如é被转化为é,即使对于MySQL数据库,表和字段排序规则设置为utf8_general_ci.页面的Content-Type中的编码也设置为UTF8.
我知道utf8_encode/decode,但我不太清楚在哪里以及如何使用它.
我已经阅读了" 绝对最低限度的每个软件开发人员,绝对必须知道关于Unicode和字符集(没有借口!) "的文章,但我需要一些MySQL/PHP特定的指针.
问题:如何确保用户输入的包含国际字符的数据不会被破坏?
在第一眼看http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet时,我认为缺少一件重要的事情(也许我忽略了这一点).根据您的MySQL安装和/或配置,您必须设置连接编码,以便MySQL知道您在客户端期望的编码(意味着MySQL连接的客户端,应该是PHP脚本).您可以通过手动发出一个来完成此操作
SET NAMES utf8
在发送到MySQL服务器的任何其他查询之前进行查询.
如果您在PHP端使用PDO,则可以设置连接以通过使用在每个(重新)连接上自动发出此查询
$db=new PDO($dsn, $user, $pass); $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");
初始化数据库连接时.
整理和字符集不是一回事.你的校对需要匹配字符集,所以如果你的字符集是utf-8,那么整理也是如此.选择错误的排序规则不会破坏您的数据 - 只是错误地进行字符串比较/排序.
也就是说,有几个地方,你可以在PHP中设置字符集设置.如果可能的话,我建议你在整个过程中使用utf-8.需要charset指定的位置是:
数据库.这可以在数据库,表和字段级别上设置,甚至可以在每个查询级别上设置.
PHP和数据库之间的连接.
HTTP输出; 确保HTTP标头Content-Type
指定utf-8.您可以在PHP和Apache中设置默认值,也可以使用PHP的header
函数.
HTTP输入.通常,表单将在提供页面的同一个字符集中提交,但为了确保,您应该指定该accept-charset
属性.还要确保URL是utf-8编码的,或者避免在url(和GET参数)中使用非ascii字符.
utf8_encode
/ decode函数有点奇怪的命名.它们专门在latin1(ISO-8859-1)和utf-8之间进行转换.如果您的应用程序中的所有内容都是utf-8,那么您将不必使用它们.
关于utf-8和PHP至少有两个陷阱.首先,PHP的内置字符串函数希望字符串是单字节的.对于很多操作,这没关系,但它意味着你不能依赖strlen
和其他功能.这个页面的限制有很好的破坏.通常,这不是一个大问题,但特别是在使用三方库时,您需要意识到事情可能会爆炸.一个选项也是使用mb_string扩展,它可以选择用utf-8识别替代方法替换所有麻烦的函数.它仍然不是100%防弹解决方案,但它适用于大多数情况.
另一个问题是PHP的某些安装仍然magic_quotes
打开了设置.这个问题与utf-8正交,但可能导致一些头部刮伤.为了你自己的理智,把它关掉.