请看一下这个帖子(并在发布问题之前先使用搜索).
在你的情况下,我认为你已经忘记为数据库连接设置了正确的字符集(使用SET NAMES语句或mysql_set_charset()) - 但这很难说.
这是chazomaticus的一句话,他在喜欢的帖子中给出了一个完美的答案,列出了你需要关注的所有要点:
存储:
utf8_unicode_ci在数据库的所有表和文本列上指定(或等效)排序规则.这使得MySQL以UTF-8本地存储和检索值.恢复:
- 在PHP中,无论您使用什么DB包装器,都需要将连接字符集设置为utf8.这样,当MySQL将数据移交给PHP时,MySQL不会从其原生UTF-8进行转换.*请注意,如果您不使用数据库包装器,您可能必须发出一个查询来告诉MySQL以UTF-8为您提供结果:(
SET NAMES 'utf8'一旦连接).交货:
- 您必须告诉PHP向客户端提供正确的标头,因此文本将被解释为UTF-8.在PHP中,您可以使用
default_charsetphp.ini选项,或者Content-Type自己手动发出 标题,这只是更多工作但具有相同的效果.投稿方式:
- 您希望浏览器发送给您的所有数据都是UTF-8.不幸的是,可靠地执行此操作的唯一方法是将
accept-charset属性添加 到所有<form>标记中:<form ... accept-charset="UTF-8">.- 请注意,W3C HTML规范说客户端"应该"默认在服务器所服务的任何字符集中将表单发送回服务器,但这显然只是一个推荐,因此需要在每个
<form>标签上明确.- 虽然在这方面,您仍然希望在尝试存储或在任何地方使用它之前,将每个提交的字符串验证为有效的UTF-8.PHP
mb_check_encoding()诀窍,但你必须虔诚地使用它.处理:
- 不幸的是,这是困难的部分.您需要确保每次处理UTF-8字符串时都安全地执行此操作.最简单的方法是广泛使用PHP的
mbstring扩展.- PHP的字符串操作默认情况下不是UTF-8安全的.对于普通的PHP字符串操作(如连接),您可以安全地执行某些操作,但对于大多数情况,您应该使用等效
mbstring函数.- 要知道你在做什么(阅读:不要搞砸了),你真的需要知道UTF-8以及它如何在尽可能低的水平上运行.查看来自utf8.com的任何链接,获取一些很好的资源,以了解您需要了解的所有信息.
- 此外,我觉得应该在某处说,即使它看起来很明显:你要服务的每个PHP或HTML文件都应该用有效的UTF-8编码.
请注意,您不需要使用utf-8 - 重要的部分是在任何地方使用相同的字符集,而不管可能是什么字符集.但如果你还需要改变一些东西,请使用utf-8.