JavaScript encodeURI返回意外值

时间:2019-02-16 13:20:38

标签: javascript php url-encoding

我在使用JavaScript对URL编码文本时遇到问题。 我在德国,那里有这些“ Umlaute”(ÄÖÜ)字,这些字母也有一些问题。

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

Äpfel>>>网址编码>>>%C3%84pfel

%C3%84pfel >>>网址解码>>>Äpfel

为了进行测试,我创建了以下php.file(poc.php),其中没有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>

有人知道导致这种行为的原因吗?

1 个答案:

答案 0 :(得分:0)

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

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

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