蟒蛇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。你真的应该读的

在(非常小的)简单地说,一个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"))

+0

这是对unicode的一个很好的解释,虽然我不确定它是否真的帮助OP从HTML实体转到utf-8输出。 – geoffspear 2012-04-16 11:05:52

+0

@Wooble但OP的问题不是HTML实体!这是Unicode编码(由UnicodeEncodeError证明)。 – katrielalex 2012-04-16 11:09:14

+0

我需要html实体字符串,tnx的解释,但我已经读了很多字符表达式。 – badc0re 2012-04-16 11:15:48