首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UnicodeDecodeError:“ascii”编解码器无法解码位置%1中的字节0xef

UnicodeDecodeError:“ascii”编解码器无法解码位置%1中的字节0xef
EN

Stack Overflow用户
提问于 2012-05-12 15:39:53
回答 16查看 347.2K关注 0票数 109

我在尝试将字符串编码为UTF-8时遇到了一些问题。我尝试了很多方法,包括使用string.encode('utf-8')unicode(string),但是我得到了错误:

UnicodeDecodeError:'ascii‘编解码器无法解码位置1中的字节0xef :序数不在范围内(128)

这是我的字符串:

代码语言:javascript
复制
(。・ω・。)ノ

我看不出出了什么问题,你知道吗?

编辑:问题是按原样打印字符串不能正确显示。另外,当我尝试转换它时,也会出现这个错误:

代码语言:javascript
复制
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2012-05-12 19:05:58

这与终端的编码未设置为UTF-8有关。这是我的终端机

代码语言:javascript
复制
$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> 

在我的终端上,这个示例可以使用上面的设置,但是如果我去掉了LANG设置,那么它就不能工作

代码语言:javascript
复制
$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

请参考您的linux变体的文档,以了解如何使此更改永久生效。

票数 72
EN

Stack Overflow用户

发布于 2012-05-12 15:53:01

尝试:

代码语言:javascript
复制
string.decode('utf-8')  # or:
unicode(string, 'utf-8')

编辑:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')给出了u'(\uff61\uff65\u03c9\uff65\uff61)\uff89',这是正确的。

所以你的问题一定出在别的地方,如果你试图用它做一些事情,因为有一个隐式的转换正在进行(可能是打印,写入到流中……)

为了说得更多,我们需要看一些代码。

票数 25
EN

Stack Overflow用户

发布于 2012-05-12 19:43:09

我+1感谢马塔在https://stackoverflow.com/a/10561979/1346705上的评论和Nick Craig-Wood的演示。您已经正确地解码了字符串。问题出在print命令将Unicode字符串转换为控制台编码时,而控制台无法显示该字符串。尝试将字符串写入一个文件,并使用一些支持Unicode的像样的编辑器查看结果:

代码语言:javascript
复制
import codecs

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

然后,您将看到(。・ω・。)ノ

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10561923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档