【发布时间】:2019-02-14 20:35:15
【问题描述】:
我知道,我不应该使用 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 并将 UTF-8 编码分配给 $_COOKIE ?当我访问 $_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自动解码的。但是它是如何知道源字符集的,又是如何决定输出哪个字符集的呢?
【问题讨论】:
-
我会尝试使用 mb_convert_encoding。 php.net/manual/en/function.mb-convert-encoding.php
-
@Alex 这里和
utf8_decode()基本一样。这是在正确的上下文中使用此类功能的罕见情况之一 :) -
对不起,你是对的。我只是忽略了它。
-
全局搜索将
encodeURIComponent()替换为其旧版等效escape()可能会达到目的。现有的 cookie 将会丢失,但今天需要解决的这个问题肯定已经发生多年了;-)
标签: php cookies utf-8 iso-8859-1