【发布时间】:2022-01-22 18:45:50
【问题描述】:
我知道非标准的 %uxxxx 方案,但这似乎不是一个明智的选择,因为该方案已被 W3C 拒绝。
一些有趣的例子:
心脏字符。 如果我在浏览器中输入:
http://www.google.com/search?q=♥
然后复制粘贴,我看到了这个网址
http://www.google.com/search?q=%E2%99%A5
这看起来像是 Firefox(或 Safari)正在这样做。
urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'
这是有道理的,除了不能用 Latin-1 编码的东西,比如三点字符。
…
如果我输入网址
http://www.google.com/search?q=…
到我的浏览器然后复制粘贴,我得到了
http://www.google.com/search?q=%E2%80%A6
返回。这似乎是这样做的结果
urllib.quote_plus(x.encode("utf-8"))
这是有道理的,因为……不能用 Latin-1 编码。
但我不清楚浏览器如何知道是使用 UTF-8 还是 Latin-1 解码。
因为这似乎是模棱两可的:
In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'
有效,所以我不知道浏览器如何确定是使用 UTF-8 还是 Latin-1 解码。
我需要处理的特殊字符的正确做法是什么?
【问题讨论】:
-
您的两个示例都编码为 UTF-8。第一个肯定不是 Latin-1,因为它有三个字节长......
-
%E2%99%A5 是 the "black heart suit" in UTF-8 字节值的十六进制。那颗黑色的心不是Latin-1 character set 的一部分。
-
要可靠地查看浏览器的编码方式和内容(以及许多其他有用的信息),请使用大多数现代浏览器中内置的开发人员工具,或获取免费的 HTTP 调试器,如 Fiddler。
标签: unicode utf-8 character-encoding urlencode web-standards