javascript - 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>
有谁知道是什么导致了这种行为?
解决方案
您收到的怪异字节流 %EF%BF%BD 是 UTF-8 版本的 Unicode 替换字符,即字面意思是 � 符号。
Javascript 部分可以对刚刚 url 编码的文本进行 url 解码,它只是被要求为缺少的符号编码符号。
所以:您系统的某些部分没有使用 utf-8,而是使用其他一些字符集,并且进行了不必要的转换。我的猜测是该文件是用 latin-1 编码的,又名。ISO 8859-1,PHP 尝试像 UTF-8 一样读取它,将无法识别的字符 0xc4(latin-1 中的“Ä”)转换为替换字符符号。
推荐阅读
- python - 列名称的 sqlalchemy 别名也保留原始名称
- c - 无法在循环中连续获取字符
- java - 无法使用 spring 数据和 mongodb 存储库扩展自定义存储库接口
- c++ - 使用具有未定义行为的(STL)副本?
- python - 在keras中的lstm层之后添加全连接层
- memory - Rust:String 的内存释放
- assembly - TASM - 如何将正常字大小的寄存器推入浮点堆栈?
- python - Python:针对人脸反欺骗问题的预训练 VGG 人脸模型
- xamarin.forms - Azure BlobStorage restapi ETag 始终为空。为什么?(xamarin 或任何使用 blob 存储的 c# 项目)
- android - android alertdialog 在意图返回活动后不显示