我知道,我不应该使用ISO-8859-1,但是我已经处理了这个网站,因此不可能将所有PHP / JS / HTML迁移为使用UTF-8而不是ISO-8859-1
我的问题是:此网站使用encodeURIComponent
将值存储在具有Javascript的cookie中。例如,在index.html
文件(使用<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
)中,有一个<script>
标签,其中的代码如下:
document.cookie = "xxx=" + encodeURIComponent("não") + ";.....";
cookie值存储为n%C3%A3o
(我在“应用程序”标签中选中了Chrome上的开发工具)。尽管HTML文件是ISO,但cookie仍保存为UTF-8。大!这就是encodeURIComponent
的工作方式,它将始终将其转换为UTF-8。
当PHP页面使用此xxx
cookie值执行某些操作时,就会出现问题。由于所有PHP文件都保存为ISO-8859-1,因此当它尝试访问$_COOKIE["xxx"]
时,便开始出现问题,例如字符损坏。
很明显,我必须使用utf8_decode($_COOKIE["xxx"])
来解决此问题,因为它会获取cookie值并将其解析为ISO-8859-1。
问题是该网站上有数百个PHP文件,这些文件在各处都使用cookie。更改所有代码行将需要大量时间-自从我的老板希望今天解决此问题以来,我就没有这个时间。
这是我的问题:
1)PHP如何知道cookie应该被读为UTF-8并为$ _COOKIE分配UTF-8编码?当我访问$ _COOKIE时,它显然已经解码了cookie值,因为%xx
已经被解码了。我知道您可以说Of course you dumb, cookies are all the time stored as UTF-8.
。但这并非总是如此。
如果在PHP文件(使用ISO-8859-1编码保存)中,则执行以下操作:
setcookie("xxx","não");
当我检查Cookie(在Chrome开发工具->应用程序标签中)时,它显示n%E3o
。
你看到了吗? n%E3o
与n%C3%A3o
不同。
因此,在解析cookie时,PHP如何知道n%E3o
应该被解码为ISO-8859-1,PHP如何知道n%C3%A3o
应该被解码为UTF-8?
我知道_GET
,_POST
,_COOKIE
超全局变量是由PHP自动解码的。但是它如何知道源字符集,以及如何确定要输出哪个字符集?
答案 0 :(得分:1)
PHP根本不真正了解编码。在这种情况下,则不需要这样做。 Percent-encoding(用于cookie的内容)显式地在编码中性字节级别工作。意思是,编码本身表示原始字节。 %C3%A3
表示两个字节0xC3A3
,它是字符“ã”的UTF-8编码。或者,如果您将它们读为ISO-8859-1,则为字符“ã”的编码。因此,PHP只是将百分比编码解码为原始字节。最终会出现什么字符取决于您对它们的解释。 PHP根本不解释它们,PHP字符串只是原始字节数组。
相反,PHP源代码文件中的任何字符串文字也只是一个原始字节数组,其内容取决于源代码文件的编码。在保存为ISO-8859-1的PHP文件中,字符串文字"não"
包含字节0x6EF16F
。作为UTF-8存储的同一文件包含字节0x6EC3A36F
。在百分比编码中,这些原始字节仅按原样编码。
有关该主题的更多详细信息,请参见What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。