蟒蛇ASCII码为utf
所以,当我在我的母语张贴在mod_python中的名称或文字,我得到:蟒蛇ASCII码为utf
македонија
,我也得到:
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
。你真的应该读的
- Pragmatic Unicode一个或两个(NED尔德)
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)(乔尔斯波斯基)
在(非常小的)简单地说,一个Unicode代码点是一个抽象的“啄“代表一个字符。程序员喜欢使用这些字符串,因为我们喜欢将字符串视为一次一个字符。不幸的是,很久以前就颁布了一个字符必须适合一个字节的内存,所以最多可以有256个不同的字符。简单的英语很好,但不适用于其他任何东西。有一个代码点的全局列表 - 其中成千上万的代码点 - 这是为了保存每个可能的字符,但显然它们不适合一个字节。
解决办法:有码点,使一个字符串有序列表之间的差,并且其编码作为字节序列。你必须清楚,每当你使用一个字符串,它应该在哪些这些形式。
要在窗体之间进行转换,您可以.encode()
代码点列表(一个Unicode字符串)作为字节列表和.decode()
字节到代码点列表中。为此,您需要知道如何将代码点映射到字节,反之亦然,这是编码。如果你没有指定,Python 2.x会猜测你的意思是ASCII。如果这种猜测是错误的,你会得到一个UnicodeError
。
请注意,Python 3.x在处理Unicode字符串方面要好得多,因为字节和代码点之间的区别更加明确。
整理。
编辑:我想我应该指出这是如何帮助。但你真的应该阅读上面的链接!只要投入.encode()
s和.decode()
就是一种可怕的编码方式,有一天你会被更糟糕的问题困扰。
无论如何,如果你通过你的壳做什么步骤,你会看到
>>> 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会尝试通过自动对ASCII字符串进行ASCII编码来获得帮助,如果它们确实是ASCII字符串,则很好,但如果它们不是这样的话,则不会。因此你需要做req.write(hparser.unescape(text).encode("some-encoding"))
。
这是对unicode的一个很好的解释,虽然我不确定它是否真的帮助OP从HTML实体转到utf-8输出。 – geoffspear 2012-04-16 11:05:52
@Wooble但OP的问题不是HTML实体!这是Unicode编码(由UnicodeEncodeError证明)。 – katrielalex 2012-04-16 11:09:14
我需要html实体字符串,tnx的解释,但我已经读了很多字符表达式。 – badc0re 2012-04-16 11:15:48