- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Python 3.6.1,Requests 2.13.0,我对请求的 URL 进行了奇怪的编码。我有一个在查询字符串中包含中文字符的 URL,例如 huà 话用
,应该 %-encode 为 hu%C3%A0%20%E8%A9%B1%20% E7%94%A8
甚至 hu%C3%A0+%E8%A9%B1+%E7%94%A8
,但由于某种原因,它是 %-encoding 到 hu %C3%83%C2%A0%20%C3%A8%C2%A9%C2%B1%20%C3%A7%C2%94%C2%A8
。这是不正确的。我一直在使用 http://r12a.github.io/apps/conversion/帮助我处理编码的页面。我还使用了 JavaScript encodeURI
和 PHP urlencode
并且没有得到任何接近我看到的 Requests 库所做的事情。
我是不是做错了什么导致编码相差太远?
更新:我研究了 Mojibake 编码并深入研究了 Requests 库,发现了问题所在,但我仍然不确定如何解决它。
我正在对内部服务器进行调用,使用简单的 .get(url)
调用。调用转到服务器并获得重定向响应。重定向页面的 header 中有一个 meta charset="UTF-8"
,其中列出的 URL 是正确的。离开服务器的 location
header 是可以的;它被编码为 UTF-8 并且 Content-Type
header 上有一个 charset=UTF-8
。但是,当我在 Python 中调试重定向响应时,我注意到响应对象上的 header 不正确,它似乎没有被正确解码。 headers
属性在 location
中包含此内容:huÃ\xa0 話 ç\x94
。如上所说,应该解码为:huà话用
。因此,那个奇怪的 URL 查询字符串的 % 由 Requests 编码并设置回服务器,然后服务器拒绝该 URL(很明显)。
我能做些什么来防止 Requests 把事情搞砸吗?或者让它正确解码 location
header ? Web 浏览器似乎没有这方面的问题。
最佳答案
你有一个 Mojibake编码。编码的字节是 UTF-8 字节的 Latin-1 解释:
>>> from urllib.parse import quote
>>> text = 'huà 話 用'
>>> quote(text)
'hu%C3%A0%20%E8%A9%B1%20%E7%94%A8'
>>> quote(text.encode('utf8').decode('latin1'))
'hu%C3%83%C2%A0%20%C3%A8%C2%A9%C2%B1%20%C3%A7%C2%94%C2%A8'
您可以通过再次手动编码为 Latin-1,然后从 UTF-8 解码来反转该过程:
>>> unquote('hu%C3%83%C2%A0%20%C3%A8%C2%A9%C2%B1%20%C3%A7%C2%94%C2%A8').encode('latin1').decode('utf8')
'huà 話 用'
或者您可以使用 ftfy
library自动修复错误的编码(ftfy
通常做得更好,尤其是当 Windows 代码页涉及到 Mojibake 时):
>>> from ftfy import fix_text
>>> fix_text(unquote('hu%C3%83%C2%A0%20%C3%A8%C2%A9%C2%B1%20%C3%A7%C2%94%C2%A8'))
'huà 話 用'
关于 URL 的来源,你是这样说的:
The location header leaving the server is ok; it is encoded as UTF-8
那是你的问题,就在那里。 HTTP header 始终编码为 Latin-1(*)。服务器必须将 Location header 设置为完全百分比编码的 URL,以便所有 UTF-8 字节都表示为 %HH
转义序列。这些只是 ASCII 字符,完美保存在 Latin-1 上下文中。
如果您的服务器将 header 作为未转义的 UTF-8 字节发送,则 HTTP 客户端(包括 requests
)会将其解码为 Latin-1 而不是导致您观察到的确切 Mojibake 问题。由于 URL 包含无效的 URL 字符,requests
将 Mojibake 结果转义为百分比编码版本。
(*) 实际上,Location
header 应该是 absoluteURI
as per RFC2396它始终是 ASCII(7 位)干净数据,但由于某些其他 HTTP header 允许“描述性”文本,因此 Latin-1 (ISO-8859-1) 是 header 数据可接受的默认编码。查看TEXT
rule in section 2.2 of the HTTP/1.1 RFC , 和 http.client
module在解码任何 header 中的非 ASCII 数据时,最终解码 requests
的 header 在这方面遵循此 RFC。仅当按照 the Message Header Extensions RFC 2047 包装时,您才能提供非 Latin-1 数据,但这不适用于 Location
header 。
关于Python 请求奇怪的 URL %-Encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188661/
我使用术语“词法编码”是因为我没有更好的编码。 与字母相反,单词可以说是交流的基本单位。 Unicode 尝试为所有已知字母表的每个字母分配一个数值。对一种语言来说是字母,对另一种语言来说是字形。 U
我在UTF-8中有csv文件,我想将其保存在西里尔字母(Windows 1251)中...在中,我仅找到Atom -重新打开,并使用ctrl+shift+u编码 在 Sublime Text 3 中,
在lua 5.3引用手册中,我们可以看到: Lua is also encoding-agnostic; it makes no assumptions about the contents of a
看完后how gzip compression works它让我思考。如果源和代理服务器 (CDN) 都支持 gzip,则添加 Vary: Accept-Encoding头需要吗? 最佳答案 Vary
我正在向我的项目添加一项功能,我们将生成指向我们网站内部内容的链接,并且我们希望这些链接尽可能短,因此我们将制作自己的“URL 缩短器”。 我想知道生成的短网址的最佳编码/字母表是什么。这很大程度上是
我构建了一个用于压缩 HTTP 输出的模块。阅读spec ,我在以下几件事上没有发现明显的区别: 接受编码: 是否应将其视为与 Accept-Encoding: * 相同,还是视为不存在 header
在下面的代码中: package main import ( "bytes" "encoding/json" "fmt" ) type Student struct {
这个问题在这里已经有了答案: Why does encode delete the argument? (1 个回答) 6年前关闭。 Encode::encode 的文档说: encode $octe
在Android4.1中,实时编码应用中经常会请求关键帧。但是如何使用 MediaCodec 对象呢?当前的 Android4.2 SDK 似乎不支持它。 最佳答案 您可以 通过在排队输入缓冲区时指定
我有 CSV 格式的数据,这些数据在字符编码方面被严重打乱,可能在不同的软件应用程序(LibreOffice Calc、Microsoft、Excel、Google Refine、自定义 PHP/My
您可能知道,在 Perl 中,“utf8”意味着 Perl 对 UTF-8 的宽松理解,它允许使用技术上不是 UTF-8 中有效代码点的字符。相比之下,“UTF-8”(或“utf-8”)是 Perl
本文整理了Java中org.geotools.ysld.encode.YsldEncoder.encode()方法的一些代码示例,展示了YsldEncoder.encode()的具体用法。这些代码示例
现在还没有任何关于红色的书,因为它太新了。因此,我正在尝试遵循一本旧的 Rebol 书,并从中挽救我能得到的东西。 我发现一些命令,例如 read,由于文件编码的原因,我无法执行代码。 save %
错误:无法映射用于编码 UTF-8 的字符。由于版权特征,我收到此错误。我使用的是 Netbeans 7.2。 /** * � 2006 * * This class was generate
现在还没有任何关于红色的书,因为它太新了。因此,我正在尝试遵循一本旧的 Rebol 书,并从中挽救我能得到的东西。 我发现一些命令,例如 read,由于文件编码的原因,我无法执行代码。 save %
错误:无法映射用于编码 UTF-8 的字符。由于版权特征,我收到此错误。我使用的是 Netbeans 7.2。 /** * � 2006 * * This class was generate
我正在尝试使用客户端提供的值在 PHP 中测试 Soap Security header 。 他们提供的值(value)如... wTAmCL9tmg6KNpeAQOYubw== ...并说这是一个
这个问题已经有答案了: ClassNotFoundException/NoClassDefFoundError in my Java web application (3 个回答) 已关闭 8 年前。
世界!我正在使用 .Net Framework 4 System.Net.Sockets.TcpClient 编写简单的 HTML 服务器。 我在 StringBuilder html 中有 HTML
我正在尝试使用 Yii 来提供网络服务。自动生成的 wsdl 如下。我可以从命令行成功使用 Web 服务,但是通过 Web 浏览器,我得到了 SOAP-ERROR: Encoding: Violati
我是一名优秀的程序员,十分优秀!