我在尝试将字符串编码为 UTF-8 时遇到了一些问题。我尝试了很多方法,包括使用 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)
这与您的终端编码未设置为 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 变体的文档,以了解如何使此更改永久生效。
尝试:
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'
,这是正确的。
所以你的问题一定出在其他地方,可能如果你试图用它做一些事情,那么有一个隐式转换正在进行(可能是打印,写入流......)
要说更多,我们需要查看一些代码。
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
。
string
是 utf8 编码的。如果您打印它,它只会将字节写入输出流,如果您的终端不将其解释为 utf8,那么您最终会得到垃圾。使用 decode
将其转换为 unicode,然后您可以再次将其 encode
转换为您的终端可以理解的编码。
我对 mata 在 https://stackoverflow.com/a/10561979/1346705 的评论和 Nick Craig-Wood 的演示 +1。您已正确解码字符串。问题在于 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()
然后您将看到 (。・ω・。)ノ
。
如果您在远程 主机上工作,请查看您本地 PC 上的/etc/ssh/ssh_config
。
当此文件包含一行时:
SendEnv LANG LC_*
通过在行首添加 #
将其注释掉。它可能会有所帮助。
通过这一行,ssh
将您 PC 的语言相关环境变量发送到 remote 主机。它会导致很多问题。
尝试在脚本开头将系统默认编码设置为 utf-8
,以便所有字符串都使用它进行编码。
# coding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
可以按照 Andrei 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)
谢谢。
#coding: utf-8
而不是 # -*- coding: utf-8 -*-
这更容易记住。与 Python PEP 263 -- Defining Python Source Code Encodings 一起开箱即用。
我的终端没有问题。上面的答案帮助我找到了正确的方向,但在我添加 'ignore'
之前它对我不起作用:
fix_encoding = lambda s: s.decode('utf8', 'ignore')
如以下评论所示,这可能会导致不良结果。 OTOH,它也可以很好地发挥作用以使事情正常进行,并且您不在乎失去一些角色。
这适用于 ubuntu 15.10:
sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
看起来您的字符串被编码为 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'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
,我希望它正确编码。
就我而言,这是由于我的 Unicode 文件与“BOM”一起保存造成的。为了解决这个问题,我使用 BBEdit 打开了文件,并选择了“另存为...”来选择编码“Unicode(UTF-8)”而不是“Unicode(UTF-8,带 BOM)” "
我遇到了相同类型的错误,我发现控制台无法以另一种语言显示字符串。因此,我进行了以下代码更改以将 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 ])
这是最佳答案:https://stackoverflow.com/a/4027726/2159089
在 Linux 中:
export PYTHONIOENCODING=utf-8
所以 sys.stdout.encoding
没问题。
BOM,对我来说经常是 BOM
vi 文件,使用
:set nobomb
并保存它。在我的情况下,这几乎总是能解决它
我遇到了同样的错误,URL 包含非 ascii 字符(值 > 128 的字节)
url = url.decode('utf8').encode('utf-8')
为我工作,在 Python 2.7 中,我想这个赋值改变了 str
内部表示中的“某些东西”——即,它强制正确解码 url
中的支持字节序列,最后将字符串放入 utf-8 str
将所有魔法都放在正确的位置。 Python 中的 Unicode 对我来说是黑魔法。希望有用
我用 'ENGINE': 'django.db.backends.mysql' 解决了在文件 settings.py 中更改的问题,不要使用 'ENGINE': 'mysql.connector.django',
只需使用 str()
将文本显式转换为字符串。为我工作。
不定期副业成功案例分享
sudo apt-get install language-pack-de
或sudo locale-gen de_DE.UTF-8
(对于德语区域设置)。LC_ALL
,最简单的修复它的值是C.UTF-8