$ _COOKIE全局var编码

时间:2018-09-10 11:57:27

标签: php cookies utf-8 iso-8859-1

我知道,我不应该使用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%E3on%C3%A3o不同。

因此,在解析cookie时,PHP如何知道n%E3o应该被解码为ISO-8859-1,PHP如何知道n%C3%A3o应该被解码为UTF-8?

我知道_GET_POST_COOKIE超全局变量是由PHP自动解码的。但是它如何知道源字符集,以及如何确定要输出哪个字符集?

1 个答案:

答案 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