[英]How do I check whether have encoded in utf-8 successfully
给定一个字符串
u ='abc'
哪种语法适合编码为utf8?
u.encode('utf-8')
要么
u.encode('utf8')
我怎么知道我已经用utr-8编码了?
首先,如果要谈论Python 2或Python 3,则需要区别对待,因为Unicode处理是两个版本之间最大的区别之一。
unicode
类型包含文本字符 str
包含8位字节的序列,有时以某些未指定的编码表示文本 s.decode(encoding)
接受一个序列字节,并在给定字节使用的编码后从其构建文本字符串。 它从str
到unicode
,例如"Citt\\xe0".decode("iso8859-1")
将为您提供文本“Città”(意大利语为城市), "Citt\\xc3\\xa0".decode("utf-8")
也会出现同样的情况"Citt\\xc3\\xa0".decode("utf-8")
。 可以省略编码,在这种情况下,含义是“使用默认编码”。 u.encode(encoding)
接受一个文本字符串,并以给定的编码方式构建表示该字符串的字节序列,从而逆转了decode
的处理。 它从unicode
到str
。 如上所述,可以省略编码。 使用Python处理unicode时,造成混淆的部分原因是该语言试图变得有点聪明,并且会自动执行操作。
例如,你可以调用encode
也是对str
对象和意思是“编码使用默认的编码时,最终使用指定的编码或者未指定默认的编码,从这些字节解码自带的文本”。
同样,您也可以在unicode
对象上调用decode
,意思是“使用默认编码,最终使用指定的编码,解码来自此文本的字节”。
例如,如果我写
u"Citt\u00e0".decode("utf-8")
Python给出错误:
UnicodeEncodeError:'ascii'编解码器无法在位置3处编码字符u'\\ xe0':序数不在范围内(128)
注意:错误是关于编码失败,而我要求解码 。 原因是我要求解码文本(废话,因为它已经被“解码”了……它是文本),Python决定先使用“ ascii”编码对它进行编码,但失败了。 更好的是,IMO不必对Unicode对象进行decode
,而不必对字符串对象encode
:错误消息会更清晰。
更令人困惑的是,在Python 2中, str
用于未编码的字节 ,但是它也用于文本,例如字符串文字是str
对象。
为了解决某些问题,Python 3进行了一些关键更改
str
用于文本,包含unicode字符,字符串文字是unicode文本 unicode
类型不再存在 bytes
类型用于8位字节序列,这些序列可能以某些未指定的编码表示文本 例如在Python 3中
'Città'.encode('iso8859-1') → b'Citt\xe0'
'Città'.encode('utf-8') → b'Citt\xc3\xa0'
同样,您不能对文本字符串调用decode
,也不能对字节序列调用encode
。
有时,将文本编码为字节可能会失败,因为指定的编码无法处理所有unicode。 例如iso8859-1
无法处理中文。 这些错误可以通过几种方式处理,例如引发异常(默认)或替换无法用其他方式编码的字符。
但是,编码utf-8
能够编码任何unicode字符,因此编码为utf-8
绝不会失败。 因此,问如何知道将文本编码为utf-8
是否正确是没有意义的,因为它总是会发生(对于utf-8
)。
解码也可能失败,因为在指定的编码中字节序列可能没有意义。 例如,字节0x43 0x69 0x74 0x74 0xE0
的序列不能解释为utf-8
因为没有适当的前缀就不能出现字节0xE0
。
像iso8859-1
这样的编码,但是解码不会失败,因为任何字节0..255都具有字符含义。 大多数“本地编码”都是这种类型的...它们将所有256个可能的8位值映射到某个字符,但只覆盖了unicode字符的一小部分。
使用iso8859-1
解码将永远不会引发错误(任何字节序列均有效),但如果字节使用其他编码,则当然可以为您提供无用的文本。
第一个解决方案:
isinstance(u, unicode)
第二种解决方案:
try:
u.decode('utf-8')
print "string is UTF-8, length %d bytes" % len(string)
except UnicodeError:
print "string is not UTF-8"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.