gpt4 book ai didi

python ascii码到utf

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:27 29 4
gpt4 key购买 nike

所以当我用我的母语在 mod_python 中发布一个名字或文本时,我得到:

македонија

我还得到:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

当我使用:

hparser = HTMLParser.HTMLParser() 
req.write(hparser.unescape(text))

如何解码?

最佳答案

如果不了解底层机制,就很难解释UnicodeError。你真的应该阅读其中一个或两个

简而言之,Unicode 代码点是代表一个字符1 的抽象“东西”。程序员喜欢使用这些,因为我们喜欢将字符串视为一次一个字符。不幸的是,很久以前就规定一个字符必须适合一个字节的内存,因此最多可以有 256 个不同的字符。这对简单的英语很好,但对其他任何东西都不起作用。有一个全局代码点列表——数以千计——旨在包含每个可能的字符,但显然它们不适合一个字节。

解决方案:构成字符串的代码点的有序列表与其作为字节序列的编码之间存在差异。无论何时使用字符串,您都必须清楚它应该采用哪种形式。

要在形式之间进行转换,您可以.encode() 将代码点列表(Unicode 字符串)作为字节列表,以及.decode() 字节进入代码点列表。为此,您需要知道如何将代码点映射到字节,反之亦然,这就是编码。如果您不指定一个,Python 2.x 将猜测您指的是 ASCII。如果猜测错误,您将得到一个 UnicodeError

请注意,Python 3.x 在处理 Unicode 字符串方面要好得多,因为字节和代码点之间的区别更加明确。

1有点。


编辑:我想我应该指出这有何帮助。但是你真的应该阅读上面的链接!到处乱扔 .encode().decode() 是一种糟糕的编码方式,总有一天你会遇到更糟糕的问题。

无论如何,如果您单步执行在 shell 中所做的操作,您会看到

>>> from HTMLParser import HTMLParser
>>> text = "македонија"
>>> hparser = HTMLParser()
>>> text = hparser.unescape(text)
>>> text
u'\u043c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u0458\u0430'

我在这里使用的是 Python 2.7,所以这是一个 Unicode 字符串,即一系列 Unicode 代码点。我们可以将它们编码为常规字符串(即字节列表),如

>>> text.encode("utf-8")
'\xd0\xbc\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd0\xb8\xd1\x98\xd0\xb0'

但我们也可以选择不同的编码!

>>> text.encode("utf-16")
'\xff\xfe<\x040\x04:\x045\x044\x04>\x04=\x048\x04X\x040\x04'

您需要决定要使用的编码。

你做的时候出了什么问题?好吧,并非每种编码都能理解每个代码点。特别是 "ascii" 编码只理解前 256!所以如果你尝试

>>> text.encode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)

你只是得到一个错误,因为你不能用 ASCII 编码这些代码点。

当您执行 req.write 时,您正在尝试在请求中写入代码点列表。但是 HTML 请求不理解代码点:它们只使用 ASCII。 Python 2 将尝试通过自动对您的 Unicode 字符串进行 ASCII 编码来提供帮助,如果它们真的是 ASCII 就没问题,但如果不是的话就不行了。

所以你需要做 req.write(hparser.unescape(text).encode("some-encoding"))

关于python ascii码到utf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172431/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com