所以,我已经在这个系统上构建了很长一段时间,它目前正在将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标签很幸运地动态添加,所以我只会在一个地方改变它:)
让我听听你对此的体验。
答案 0 :(得分:2)
这很棘手。
你必须:
SET NAMES UTF8
)中的UTF-8 mb_strlen
而不是strlen
,mb_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中防止特殊字符。
我使用ë
表示法而不是ë
等。这样,无论是保存在latin1还是utf8中都无关紧要。