改变MySQL,PHP脚本,HTML中的字符编码

时间:2010-06-07 09:48:17

标签: php mysql encoding utf-8

所以,我已经在这个系统上构建了很长一段时间,它目前正在将Latin1(ISO-8859-1)输出到Web浏览器,这就是组件:

MySQL - 所有数据都与Latin1字符集一起存储

PHP - 所有PHP文本文件都存储在具有Latin1编码的磁盘上

HTML - 输出具有http-equiv =“content-type”content =“text / html; charset = iso-8859-1”元标记

所以,我试图了解不同部分的编码如何在我的工作流程中发挥作用。如果我打开PHP脚本并在文本编辑器中将其编码更改为UTF-8并将其保存回磁盘并重新加载Web浏览器,则文本全部搞砸 - 除非文本来自数据库。如果我将DB的编码更改为UTF-8并将PHP文件保留在latin1中,我必须使用utf8_decode()来正确显示数据。如果我更改HTML代码,浏览器将错误地读取它。

所以是的,我意识到,如果我想“升级”到UTF8,我必须更新此设置的所有三个部分才能正常工作,但因为它是一个庞大的系统,有大约180k行的PHP代码和数百万很多数据库/表中的帖子,我不想在没有正确理解所有内容的情况下启动这样的事情。

我没有想过什么?除了修复之外,有什么可能搞砸了更改整个MySQL安装的编码的步骤是什么?更改磁盘上数百或数千个PHP文件的编码的最简单方法是什么?

META标签很幸运地动态添加,所以我只会在一个地方改变它:)

让我听听你对此的体验。

2 个答案:

答案 0 :(得分:2)

这很棘手。

你必须:

  • 更改数据库和每个表格字符集/编码 - 我对MySQL知之甚少,但请参阅here
  • 在第一次查询之前将客户端编码设置为PHP(SET NAMES UTF8)中的UTF-8
  • 更改元标记和可能的Content-type标头(注意Content-type标头优先)
  • 将所有PHP文件转换为UTF-8 w / out BOM - 您可以使用循环和iconv轻松完成此操作。
  • 最棘手的问题:你必须改变你的大多数字符串函数调用。而不是mb_strlen而不是strlenmb_substr而不是substr$str[index]等。

答案 1 :(得分:-1)

如果您不需要,请不要转换为UTF8。它不值得麻烦。
UTF8正在成为新标准,因此对于新项目,我可以推荐它。

<强>功能
某些函数调用不再起作用。对于latin1来说:

 echo htmlentities($string);

对于UTF8,它是:

 echo htmlentities($string, ENT_COMPAT, 'UTF-8');

strlen(),substr()等。不知道多字节字符。

<强>的MySQL
mysql_set_charset('UTF8')mysql_query('SET NAMES UTF8')会将所有文本转换为来自数据库的UTF8(SELECTs)。它还会将传入的字符串(INSERT,UPDATE)从UTF8转换为表的编码。

因此,对于从latin1表中读取,不必转换表格编码 但某些角色只能在unicode中使用(如雪人☃,iPhone表情符号等),并且无法转换为latin1。 (数据将被截断)

<强>脚本
我尝试在php-scripts / templates中防止特殊字符。
我使用&euml;表示法而不是ë等。这样,无论是保存在latin1还是utf8中都无关紧要。