【发布时间】:2019-05-14 16:28:18
【问题描述】:
我正在尝试使用国家语言支持 (NLS) 对我们的网页进行一些集成测试。例如,我尝试使用包含 first_name 值“Fréd”的表单发布页面。
为此,我使用
设置 Python 3.7.3import request
然后使用数据 {'first_name': "Fr\u00E9d"}
执行 requests.post在某些时候 UTF-8 str 被翻译成字节,但那些没有被翻译成重音 e 代码。我挖掘了代码,归结为这个测试用例:
>>> "Fr\u00E9d"
'Fréd'
>>> "Fr\u00E9d".encode("utf-8")
b'Fr\xc3\xa9d'
w3schools 将 \xc3 列为带有波浪号的拉丁大写字母 A,将 \xa9 列为版权符号。
假设这不是 Python 编码的问题,我应该如何在 Python 中编码这些 NLS 字符。
提前致谢。
【问题讨论】:
-
Python 中没有 UTF-8 字符串。
"Fréd"和"Fr\u00E9d"是 Unicode 字符串(它们实际上是相同的字符串值,只是插入方式不同)。b'Fr\xc3\xa9d'是一个同名的 UTF-8 编码的字节串。 -
但是,据我了解 Unicode 的定义,它是一个代码集,编码为 UTF-8、UTF-16 或 UTF-32。 Python str 内置有一个名为 encode 的方法,它将数据编码为字节字符串。我需要知道的是如何指定字符串,以便请求类中的 .encode("utf-8") 编码正确的 utf-8 字节。顺便说一句,我已经通过指定我自己的字节字符串绕过了这个问题,但这充其量只是在我得到将处理后的值作为字符串的响应时绕过我。我的问题是,当我编写代码时
-
你说的是对的。而
b'Fr\xc3\xa9d'是'Fréd'的正确UTF-8 表示。由于您提到了 A-波浪号/版权字符:不要将b'Fr\xc3\xa9d'与'Fr\xc3\xa9d'(或'Fréd')混淆,这是由于将 UTF-8 字节解释为拉丁 1 字节而导致的 mojibake(胡言乱语)。 -
本质上:要么你看到一个没有问题的问题,要么我不明白你的问题。
-
根据几个权威网站(即w3schools.com/charsets/ref_utf_latin1_supplement.asp),é应该编码为十六进制\xE9。 \xC3 是 Ã,而 \xA9 是 ©。 é也是在生成的 HTML 中呈现的内容。我的问题是如何编写一个生成各种 NLS 字符的 str 文字,é 是我正在展示的示例。我通过使用 \xe9 编码一个字节字符串绕过了这个问题,并且我的网站正确处理了这个问题(并且反映的文本确实显示为 é。
标签: python utf-8 python-requests python-unicode