UnicodeDecodeError:'ascii' 编解码器无法解码位置 1 中的字节 0xef

2025-02-20 09:22:00
admin
原创
24
摘要:问题描述:我在尝试将字符串编码为 UTF-8 时遇到了一些问题。我尝试了很多方法,包括使用string.encode('utf-8')和unicode(string),但还是出现了错误:UnicodeDecodeError:'ascii'编解码器无法解码位置 1 中的字节 0xef:序数不在范围内(128)这...

问题描述:

我在尝试将字符串编码为 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 = '(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'
>>> 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)

解决方案 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 = '(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'
>>> 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 = '(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'
>>> 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 版本的文档,了解如何使此更改永久生效。

解决方案 2:

尝试:

string.decode('utf-8')  # or:
unicode(string, 'utf-8')

编辑:

'(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'.decode('utf-8')给出u'(/uff61/uff65/u03c9/uff65/uff61)/uff89',这是正确的。

所以你的问题一定出在其他地方,可能如果你尝试用它做一些事情,就会有一个隐式转换正在进行(可能是打印,写入流......)

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

解决方案 3:

我对 mata 在https://stackoverflow.com/a/10561979/1346705上的评论以及 Nick Craig-Wood 的演示表示赞同。您已正确解码字符串。问题出在命令上print,因为它将 Unicode 字符串转换为控制台编码,而控制台无法显示该字符串。尝试将字符串写入文件并使用支持 Unicode 的一些不错的编辑器查看结果:

import codecs

s = '(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

然后你就会看到(。・ω・。)ノ

解决方案 4:

如果您正在远程主机上工作,请查看/etc/ssh/ssh_config本地电脑

当此文件包含一行时:

SendEnv LANG LC_*

#通过在行首添加注释将其删除。这可能会有所帮助。

通过此行,ssh将您 PC 的语言相关环境变量发送到远程主机。这会导致很多问题。

解决方案 5:

utf-8尝试在脚本开始时设置系统默认编码,以便所有字符串都使用该编码进行编码。

# coding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

解决方案 6:

按照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)

谢谢。

解决方案 7:

我的终端没有问题。上述答案帮助我找到了正确的方向,但直到我添加了以下内容后,它才对我起作用'ignore'

fix_encoding = lambda s: s.decode('utf8', 'ignore')

正如下面的评论所指出的,这可能会导致不理想的结果。另一方面,它也可能只是很好地完成了任务,让你不介意丢失一些字符。

解决方案 8:

这适用于 ubuntu 15.10:

sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales

解决方案 9:

您的字符串似乎被编码为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 = '(xefxbdxa1xefxbdxa5xcfx89xefxbdxa5xefxbdxa1)xefxbex89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(/uff61/uff65/u03c9/uff65/uff61)/uff89'

解决方案 10:

就我而言,这是因为我的 Unicode 文件保存时带有“BOM”。为了解决这个问题,我使用 BBEdit 打开文件,并执行“另存为...”,选择编码“Unicode (UTF-8)”,而不是它自带的“Unicode (UTF-8, with BOM)”

解决方案 11:

我遇到了相同类型的错误,并且我发现控制台无法以其他语言显示字符串。因此,我进行了以下代码更改,将 default_charset 设置为 UTF-8。

data_head = [('x81xa1x8fox89xefx82xa2x95xdbx8fxd8x90xa7x93xx81xcb3x8cx8ex8cpx91xb1x92x86(x81x86x81xdex81x85)x81xa1x8fx89x89xf1x88xc8x8aOx81Ax82xa8x8bxe0x82xccx90Sx94zx82xcdx88xeax90xd8x95sx97vx81xa1x83}x83bx83vx82xccx82xa8x8ex8ex82xb5x95xdbx8cxafx82xc5x8fox89xefx82xa2x8amx92xe8x81xa1', '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 ])

解决方案 12:

这是最好的答案:
https://stackoverflow.com/a/4027726/2159089

在Linux中:

export PYTHONIOENCODING=utf-8

所以sys.stdout.encoding也可以。

解决方案 13:

BOM,对我来说,这太常见了

vi 文件,使用

:set nobomb

并保存。这几乎总能解决我的情况

解决方案 14:

我遇到了同样的错误,URL 包含非 ASCII 字符(值大于 128 的字节)

url = url.decode('utf8').encode('utf-8')

对我来说,在 Python 2.7 中,我猜这个分配改变了str内部表示中的“某些东西”——即,它强制对返回的字节序列进行正确的解码url,并最终将字符串放入utf-8 str中,所有魔法都在正确的位置。Python 中的 Unicode 对我来说是黑魔法。希望有用

解决方案 15:

我通过在文件 settings.py 中使用 'ENGINE': 'django.db.backends.mysql' 来解决这个问题,不要使用 'ENGINE': 'mysql.connector.django',

解决方案 16:

只需使用 将文本明确转换为字符串即可str()。对我有用。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用