我'm having a few issues trying to encode a string to UTF-8. I'尝试了很多东西,包括使用 string.encode('utf-8')
和 unicode(string)
,但是我得到了错误:
UnicodeDecodeError:'ascii'编解码器无法解码位置1的字节0xef:序数不在范围内(128)
这是我的字符串:
(。・ω・。)ノ
我不知道出了什么问题,任何想法?
编辑:问题是打印字符串不正确显示 . 此外,当我尝试转换它时出现此错误:
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)
16 回答
看起来你的字符串被编码为
utf-8
,那究竟是什么问题呢?或者你想在这做什么..?这适用于ubuntu 15.10:
在我的情况下,它是由我的Unicode文件保存带有“BOM”引起的 . 为了解决这个问题,我使用BBEdit破解了打开文件并选择了“另存为...”选择编码“Unicode(UTF-8)”而不是它带来的“Unicode(UTF-8,带BOM)” “
我得到了相同类型的错误,我发现控制台无法用另一种语言显示字符串 . 因此,我进行了以下代码更改,将default_charset设置为UTF-8 .
BOM,对我来说经常是BOM
vi文件,使用
并保存 . 这几乎总是在我的情况下修复它
我有相同的错误,URL包含非ascii字符(值大于128的字节)
为我工作,在Python 2.7中,我认为这个赋值在
str
内部表示中改变了'something' - 即,它强制正确解码url
中支持的字节序列,最后将字符串放入utf-8str
并带有所有魔法在正确的地方 . Python中的Unicode对我来说是黑魔法 . 希望有用这是最好的答案:https://stackoverflow.com/a/4027726/2159089
在linux中:
所以
sys.stdout.encoding
没关系 .这与您的终端编码未设置为UTF-8有关 . 这是我的终端
在我的终端上,该示例适用于上述,但如果我摆脱了
LANG
设置,那么它将无法工作查阅linux变体的文档,了解如何使此变更永久化 .
尝试:
编辑:
'(\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'
,这是正确的 .所以你的问题必须在某个地方,可能如果你试图用它做某事是有隐式转换(可能是打印,写入流...)
要说更多,我们需要看一些代码 .
我在1月17日对于mata的评论和Nick Craig-Wood的演示 . 您已正确解码字符串 . 问题在于
print
命令,因为它将Unicode字符串转换为控制台编码,并且控制台无法显示字符串 . 尝试将字符串写入文件,并使用支持Unicode的一些不错的编辑器查看结果:然后你会看到
(。・ω・。)ノ
.如果您正在使用远程主机,请查看本地PC上的
/etc/ssh/ssh_config
.当此文件包含一行时:
通过在行首添加
#
来评论它 . 它可能有所帮助 .使用此行,
ssh
将PC的语言相关环境变量发送到远程主机 . 它会导致_1783907问题 .尝试在脚本开头将系统默认编码设置为
utf-8
,以便使用该编码对所有字符串进行编码 .我的终端没问题 . 上面的答案帮助我找到了正确的方向,但直到我添加
'ignore'
它才对我有用:如下面的评论所示,这可能会导致不良后果 . OTOH它也可以很好地完成这个技巧,让事情发挥作用,而你不关心失去一些角色 .
可以在脚本顶部使用下面的代码,如Andrei Krasutski建议的那样 .
但我建议你在脚本的顶部添加
# -*- coding: utf-8 -*
行 .当我尝试执行
basic.py
时,省略它会在我的情况下抛出错误 .以下是
basic.py
中出现的代码,它会抛出错误 .代码有错误
然后我在最顶部添加
# -*- coding: utf-8 -*-
行并执行 . 有效 .代码没有错误
谢谢 .
我用'ENGINE'来解决文件settings.py中更改的问题:'django.db.backends.mysql',不要使用'ENGINE':'mysql.connector.django',
只需将文本显式转换为字符串使用
str()
. 为我工作 .