首页 > 解决方案 > Javascript encodeURI 返回意外的值

问题描述

我在使用 javascript 对文本进行 URL 编码时遇到问题。我在德国,我们有这些“元音变音”(ÄÖÜ),这些字母产生了一些问题。

在线编码器/解码器返回了单词“Äpfel”(苹果)的以下结果。

Äpfel >>> url-encode >>> %C3%84pfel

%C3%84pfel >>> url-decode >>> Ä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>

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

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

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

我猜这种行为的原因是在 PHP 设置中的某个地方。当我只是将文件从“poc.php”重命名为“poc.html”时,编码是正确的,并且警报返回的结果与在线编码器/解码器相同。

当我检查当前编码时,javascript 和 php 返回“utf-8”。

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

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

有谁知道是什么导致了这种行为?

标签: javascriptphpurl-encoding

解决方案


您收到的怪异字节流 %EF%BF%BD 是 UTF-8 版本的 Unicode 替换字符,即字面意思是 � 符号。

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

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


推荐阅读