2010-06-07 51 views
3

因此,我已经在此系统上构建了相当长的一段时间,并且它正在向Web浏览器输出Latin1(ISO-8859-1),这是组件:更改MySQL中的字符编码,PHP脚本,HTML

MySQL的 - 所有数据都存储在latin1字符集

PHP - 所有PHP文本文件存储在磁盘上以latin1编码

HTML - 输出有HTTP的当量=“内容类型“content =”text/html; charset = iso-8859-1“meta tag

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

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

我还没有想过什么?除了修复之外,有什么可能让这个问题变得糟什么是更改整个MySQL安装的编码的过程,以及更改磁盘上数百或数千个PHP文件的编码的最简单方法是什么?

meta标记幸运的是动态添加,所以我会改变这种只在一个地方:)

让我听到这个您的经验。

回答

2

这很棘手。

你必须:

  • 变化的DB和每个表的字符集/编码 - 我不知道很多关于MySQL,但是看到here
  • 在PHP中设置客户端编码设置为UTF-8 (SET NAMES UTF8)第一个查询
  • 变化的meta标签和可能的Content-type头(注意Content-type头具有优先权)
  • 所有PHP文件转换为UTF-8瓦特/ BOM之前 - 你可以用循环和iconv轻松做到这一点。
  • 最棘手的一切:你必须改变你的大部分字符串函数调用。不是指mb_strlen,而不是strlenmb_substr代替substr$str[index]
+0

数据库 - 检查,客户端编码 - 你的意思是当通过PHP与MySQL服务器连接时?元标记 - 检查,PHP文件 - 检查,PHP函数...呃,好的。虽然我不使用strlen和substr,那么$ str [index]是什么?你的意思是,当写一个UTF8编码的PHP文件时,我不能写<? print $ foo [“Översrift”]?>假定字符串以UTF8数据的形式发送到PHP解释器,并且保存的索引数据应该是相同的,不是? – Sandman 2010-06-07 11:06:28

+0

只要没有来自别处的数据,$ foo [“Översrift”]将继续工作,前提是所有文件都转换为utf-8。 – Wrikken 2010-06-07 16:07:32

+0

@Sandman是的,我的意思是当通过PHP与MySQL服务器连接时。我的意思是'$ str [index]'就像'$ str [0]'(索引是一个整数)。例如,你不能使用'$ str [0]'获取第一个字符,因为UTF-8是一个多字节编码;如果第一个字符占用超过1个字节(所有非ASCII字符都是这种情况),则$ str [0]将仅获得该字符的第一个字节。还有其他许多情况 - 大部分对字符串进行操作的函数都必须进行修改。 – Artefacto 2010-06-07 23:31:16

-1

不要转换为UTF-8,如果你不就得了。它不值得麻烦。
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从数据库(选择)的到来。它还会将传入的字符串(INSERT,UPDATE)从UTF8转换为表格的编码。

因此,从latin1表中读取时,不需要转换表编码。
但某些字符只能在unicode(如雪人iPhone,iPhone表情符号等)中使用,并且不能转换为latin1。 (这些数据将被截断)

脚本
我试图阻止特价字符在我的PHP脚本/模板。
我使用&euml;符号而不是ë等。这种方式是否保存在latin1或utf8中并不重要。

+1

只要你保存的内容在当前字符集中可用,MySQL表就不需要转换。但是,如果不是这样(当latin1 => utf8时这是不小的可能性),它们应该被转换(ALTER TABLE foo SET CHARACTER SET utf8),如果它们已被单独设置,它们可能会自行排列。 – Wrikken 2010-06-07 14:33:33

+0

不,如果您更改连接的编码,mysql服务器/客户端将会即时进行转换。 – 2010-06-07 14:38:49

+0

我使用它,如果我需要生成一个ms-excel csv文件。表格是用UTF8编写的,在'SET NAMES lantin1'之后,我可以写入csv文件而不需要一个utf_decode() – 2010-06-07 14:42:01