Javascript encodeURI returns 意外值

Javascript encodeURI returns unexpected value

我有一个问题 URL - 使用 javascript 对文本进行编码。 我在德国,那里有这些 "Umlaute" (ÄÖÜ),这些字母会造成一些问题。

在线 encoder/decoder return 为单词“Äpfel”(苹果)编辑了以下结果。

Äpfel >>> url-编码 >>> %C3%84pfel

%C3%84pfel >>> url-解码 >>> Äpfel

为了测试,我创建了以下没有 php 内容的 php.file (poc.php),只有 javascript:

<script type="text/javascript">
    var t = "Äpfel";
    t = encodeURI(t);
    alert(t);
    t = decodeURI(t);
    alert(t);
</script>

第一个警报return是“%EF%BF%BDpfel”,与在线编码器的结果不同。

第二个警报 returns“�pfel”(是的,带有“?”的菱形)。

似乎javascript无法解码它刚刚编码的文本。

我想这种行为的原因是在 PHP 设置中的某个地方。当我刚刚将文件从 "poc.php" 重命名为 "poc.html" 时,编码是正确的并且警报 return 与在线 encoder/decoder.

相同的结果

当我检查当前编码时,javascript 和 php return "utf-8".

在我的 "real" 项目中,我的 php 文件中包含一个“.js”文件(有同样的问题)。

<script type="text/javascript" src="scripts/functions.js"></script>

有人知道是什么原因导致了这种行为吗?

您收到的奇怪字节流 %EF%BF%BD 是 Unicode 替换字符的 utf-8 版本,即 � 符号。

Javascript 部分可以 url 解码刚刚 url 编码的文本,它只是被要求对缺失符号的符号进行编码。

因此:您系统的某些部分未使用 utf-8,而是使用其他一些字符集,并且进行了不必要的转换。我的猜测是该文件是用 latin-1 编码的,又名。 ISO 8859-1,PHP 尝试将其当作 UTF-8 来读取,将无法识别的字符 0xc4(latin-1 中的“Ä”)转换为替换字符符号。