ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python ascii代码到utf

2019-08-26 12:09:29  阅读:201  来源: 互联网

标签:mod-python python


因此,当我用我的母语在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)) 

我怎么解码呢?

解决方法:

如果你不理解底层机制,很难解释UnicodeErrors.你应该真的读过其中一个或两个

> Pragmatic Unicode(Ned Batchelder)
> The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)(Joel Spolsky)

在(非常小的)简言之,Unicode代码点是表示一个character1的抽象“thingy”.程序员喜欢使用这些,因为我们喜欢将字符串视为一次出现一个字符.不幸的是,很久以前一个字符必须符合一个字节的内存,所以最多可以有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字符串就可以了,但如果它们不是ASCII则不行.

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

标签:mod-python,python
来源: https://codeday.me/bug/20190826/1729676.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有