以下代码将导致UnicodeDecodeError
:
#-*- coding:utf-8 -*-
s="中文"
u=u"123"
u=s+u
我知道这是因为python解释器使用ascii
来解码s
。
为什么python解释器不使用文件格式(utf-8)进行解码?
答案 0 :(得分:1)
2个字符串的类型不同 - 第一个是普通字符串,第二个是unicode字符串,因此是错误。
因此,不要执行s="中文"
,而是执行以下操作来获取两者的unicode字符串:
s=u"中文"
u=u"123"
u=s+u
答案 1 :(得分:1)
代码在Python 3上完美运行。
但是,在Python 2中,如果不在字符串文字之前添加u
,则构造一个字节字符串。当想要组合一个字节串和一串字符时,要么必须解码字节串,要么编码字符串。 Python 2.x选择了前者。为了防止意外(例如,某人将二进制数据附加到用户输入并因此生成垃圾),Python开发人员选择ascii
作为该转换的编码。
您可以添加一行
from __future__ import unicode_literals
在#coding
声明之后,以便没有u
或b
前缀的文字始终是字符而不是字节文字。
答案 2 :(得分:1)
隐式解码无法知道使用了哪种源编码。该信息不与字符串一起存储。
导入后Python的所有内容都是一个字节字符串,其字符表示0-255范围内的字节。您可以从另一个模块导入该字符串,或者从文件对象等中读取该字符串。解析器知道这些字节使用了什么编码这一事实对于普通字节并不重要字符串。
因此,最好是明确地解码字节 ,而不是依赖于隐式解码。要么也为s
使用Unicode文字,要么使用str.decode()
明确解码
u = s.decode('utf8') + u