首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python文件中写入utf-8字符串

在python文件中写入utf-8字符串
EN

Stack Overflow用户
提问于 2011-01-27 02:43:27
回答 5查看 20.2K关注 0票数 8

我的.py文件中的这一行给出了一个:"UnicodeDecodeError:'utf8‘编解码器不能解码位置8-13:不支持的Unicode代码范围中的字节。“

代码语言:javascript
复制
if line.startswith(u"Fußnote"):

该文件保存在utf-8中,编码位于顶部:# --编码: utf-8 --

我在注释和数组中有很多其他带有utf-8编码的中文文本的py文件,例如: arr = u"chinese text",所以我想知道为什么这个例子对我不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-27 11:48:48

让我们非常仔细地检查该错误消息:

"UnicodeDecodeError:'utf8‘编解码器无法解码位置8-13的字节:不支持的Unicode代码范围“

请注意,它写的是“位置8-13的字节”--这是一个6字节UTF-8序列。在黑暗时代,这可能是有效的,但由于Unicode被冻结为21位,最大为4个字节。UTF-8验证和错误报告最近收紧了;令人感兴趣的是,您运行的是哪个版本的Python?

对于2.7.1和2.6.6,该错误变得更有用:“.不能解码位置8的字节XXXX :无效的开始字节”,其中XXXX只能是0xfc或0xfd,如果旧消息建议一个6字节的序列。在ISO-8859-1或cp1252中,0xfc表示U+00FC拉丁文小写字母U(也称为u-umlaut,可能有嫌疑);0xfd表示U+00FD拉丁文小写字母Y(不太可能)。

问题不在于源文件中的if line.startswith(u"Fußnote"):语句。如果它不是正确的UTF-8,您将在编译时得到一条消息,并且消息应该以"SyntaxError“而不是"UnicodeDecodeError”开头。无论如何,该字符串的UTF-8编码只有8个字节长,而不是14字节。

问题是(正如@Mark所指出的)任何“行”所指的问题。它只能是str对象。

为了更进一步,您需要回答Mark的问题(1) print repr(line) (2) site.py更改的结果。

在这个阶段,澄清strunicode对象混合的问题是个好主意(在许多操作中,不仅仅是a.startswith(b))。

除非该操作被定义为生成str对象,否则它不会强迫unicode对象到str__。a.startswith(b).It将尝试使用默认(通常为'ascii')编码来解码str对象,但情况并非如此。

示例:

代码语言:javascript
复制
>>> "\xff".startswith(u"\xab")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

>>> u"\xff".startswith("\xab")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)

此外,说“混合和你得到UnicodeDecodeError”是不正确的。很有可能str对象是在默认编码(通常是'ascii')中有效编码的-没有引发异常。

示例:

代码语言:javascript
复制
>>> "abc".startswith(u"\xff")
False
>>> u"\xff".startswith("abc")
False
>>>
票数 10
EN

Stack Overflow用户

发布于 2011-01-27 03:32:05

我可以用以下代码再现UnicodeDecodeError:

代码语言:javascript
复制
#!/usr/bin/env python
# -- coding: utf-8 --

line='Fußnoteno'
if line.startswith(u"Fußnote"):
    print('Hi')

注意,line是一个字符串对象,但u"Fußnote"是一个unicode对象。由于line是一个字符串对象,所以在调用startswith时,该unicode对象将被转换为string对象。在Python2中,默认情况是尝试使用ascii编解码器进行解码。由于无法用ascii编解码器对u"ß"进行解码,因此会引发UnicodeDecodeError。

如果您首先使line成为unicode对象,则可以避免此错误:

代码语言:javascript
复制
line='Fußnoteno'.decode('utf-8')
if line.startswith(u"Fußnote"):
    print('Hi')

或者,如果您首先使u"Fußnote"成为一个字符串对象:

代码语言:javascript
复制
line='Fußnoteno'
if line.startswith(u"Fußnote".encode('utf-8')):
    print('Hi')
票数 6
EN

Stack Overflow用户

发布于 2011-01-27 06:19:16

此错误指示行不是Unicode字符串。在X.startswith(Y)中,X和Y都必须是Unicode或字节字符串。混合,你就可以得到UnicodeDecodeError。print repr(line)检查它。另外,您是否修改了site.py以将默认编码从“ascii”更改为“utf8 8”?通常,Python2.x默认的是'ascii‘编解码器。

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

https://stackoverflow.com/questions/4812186

复制
相关文章

相似问题

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