META值charset = UTF-8可防止显示UTF-8字符

时间:2010-08-26 11:18:56

标签: php mysql utf-8 character-encoding meta-tags

我做了一个测试程序,基本上只是一个textarea,我可以输入字符,当我点击提交时,字符被写入MySQL测试表(使用PHP)。

测试表的校对是UTF-8。

如果我想将éú写入数据库,那么该脚本可以正常工作。但是,如果我将以下元语句添加到页面的<head>区域:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

......角色开始变得混乱。

我的理论是服务器强加了一些运行良好的编码,但是当我添加UTF-8指令时,它会覆盖此服务器编码,并且此UTF- *编码不包含{{1}等字符}和é。 但我认为UTF-8编码所有(bar Klingon等)字符。

基本上我的程序有效,但我想知道为什么当我添加指令时它没有。 我想我错过了什么。

任何帮助/教学最受赞赏。

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,PHP通常不处理Unicode字符集或UTF-8字符编码。除了(小心使用)mb _...函数之外,它只是将字符串视为二进制数据。

其次,您需要告诉MySQL客户端库您正在使用的字符集/编码。 'SET NAMES'SQL命令完成这项工作,不同的MySQL客户端(mysql,mysqli等......)以不同的方式提供对它的访问,例如http://www.php.net/manual/en/mysqli.set-charset.php

您的浏览器和MySQL客户端可能都默认为latin1,并且恰巧匹配。然后,MySQL知道将latin1二进制数据转换为UTF-8。当您将浏览器字符集/编码设置为UTF-8时,MySQL客户端会将该UTF-8数据解释为latin1,并错误地对其进行转码。

因此,解决方案是将MySQL客户端设置为与浏览器中的PHP输入匹配的字符集。

另请注意,表格排序与表格字符集不同 - 排序规则是指如何比较和排序字符串。令人困惑的东西,希望这有帮助!