我在想编码字符串为UTF-8的几个问题。 我试过很多东西,包括使用string.encode('utf-8')
和unicode(string)
,但我得到的错误:
在范围序数不(128):UnicodeDecodeError错误:0xef在位置1“ASCII”编解码器不能解码的字节
这是我的字符串:
(。・ω・。)ノ
我看不出有什么错误,任何想法?
编辑:问题是,打印字符串,因为它是不正确显示。 此外,这个错误,当我尝试将其转换:
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)
Answer 1:
这是你的终端不被设置为UTF-8的编码做。 这里是我的终端
$ 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
然后设置将无法正常工作
$ 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变种的文档发现如何使这种更改永久。
Answer 2:
尝试:
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'
,这是正确的。
所以你的问题一定是在某个地方oter,可能如果你试图用它做什么都是有一个隐式转换正在进行(可以打印,写入流...)
多说,我们需要看到一些代码。
Answer 3:
我的+1在马塔的评论https://stackoverflow.com/a/10561979/1346705和尼克克雷格-伍德的示范。 你已经正确解码的字符串。 该问题是与print
命令,因为它Unicode字符串转换到控制台编码,并且控制台不能够以显示该字符串。 尝试将字符串写入文件,并使用支持Unicode一些体面的编辑器的结果看:
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()
然后你会看到(。・ω・。)ノ
。
Answer 4:
如果您在远程主机上的工作,看看/etc/ssh/ssh_config
本地 PC上。
当此文件包含一行:
SendEnv LANG LC_*
与添加注释掉#
的行头。 它可能的帮助。
有了这条线, ssh
将您的PC的语言相关的环境变量到远程主机。 它会产生很多的问题。
Answer 5:
尝试设置系统默认编码为utf-8
在脚本的开始,使所有的字符串都使用该编码。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Answer 6:
没有问题,我的终端。 以上答案帮我找对了方向,但直到我说这并没有为我工作'ignore'
:
fix_encoding = lambda s: s.decode('utf8', 'ignore')
正如在下面的评论指出,这可能会导致意想不到的结果。 OTOH它也可能只是做的伎俩不够好,得到的东西的工作,你不在乎失去一些字符。
Answer 7:
它的优良使用下面的代码在脚本的顶部, 安德烈Krasutski建议。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
但我会建议你还可以添加# -*- coding: utf-8 -*
线在脚本的最顶端。
忽略它抛出下面的错误在我的情况,当我尝试执行basic.py
。
$ python basic.py
File "01_basic.py", line 14
SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
以下是存在于代码basic.py
会抛出上述错误。
错误代码
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def fill_document(doc):
with doc.create(Section('ِش سثؤفهخى')):
doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
if __name__ == '__main__':
# Basic document
doc = Document('basic')
fill_document(doc)
然后,我添加# -*- coding: utf-8 -*-
线在最高层和执行。 有效。
代码没有错误
# -*- coding: utf-8 -*-
from pylatex import Document, Section, Subsection, Command, Package
from pylatex.utils import italic, NoEscape
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def fill_document(doc):
with doc.create(Section('ِش سثؤفهخى')):
doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
if __name__ == '__main__':
# Basic document
doc = Document('basic')
fill_document(doc)
谢谢。
Answer 8:
它看起来像你的字符串编码为utf-8
那么究竟是什么问题呢? 或者什么是你想在这里做..?
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
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
Answer 9:
这个作品为Ubuntu 15.10:
sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
Answer 10:
对我来说,这是我的Unicode文件引起被保存了“BOM”。 为了解决这个问题,我破解打开使用的BBEdit文件并没有一个“另存为...”选择编码“的Unicode(UTF-8)”,而不是什么才出现了这是“的Unicode(UTF-8,与BOM) “
Answer 11:
我得到了相同类型的错误,而且我发现,控制台不能显示在另一种语言的字符串。 因此,我作出了以下代码更改设定为DEFAULT_CHARSET UTF-8。
data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')]
default_charset = 'UTF-8' #can also try 'ascii' or other unicode type
print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ])
Answer 12:
BOM,它是如此经常BOM对我来说
六,文件,使用
:set nobomb
并保存它。 这几乎总是修复它在我的情况
Answer 13:
这是最好的答案: https://stackoverflow.com/a/4027726/2159089
在Linux中:
export PYTHONIOENCODING=utf-8
所以sys.stdout.encoding
是OK。
Answer 14:
我有同样的错误,与含有非ASCII字符(字节,值> 128)的URL
url = url.decode('utf8').encode('utf-8')
工作对我来说,在Python 2.7,我想这个任务在改变“东西” str
内部表示-即,它会强制备份字节序列的正确解码url
最后提出字符串转换为UTF-8 str
与所有魔术在正确的地方。 在Unicode的Python是我的黑魔法。 希望对大家有用
Answer 15:
我解决这个问题与“引擎”的文件settings.py改变:“django.db.backends.mysql”,请勿使用“引擎”:“mysql.connector.django”,
Answer 16:
文章来源: UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1