繁体   English   中英

如何检查是否已成功在utf-8中进行编码

[英]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处理是两个版本之间最大的区别之一。

Python 2

  • unicode类型包含文本字符
  • str包含8位字节的序列,有时以某些未指定的编码表示文本
  • s.decode(encoding)接受一个序列字节,并在给定字节使用的编码后从其构建文本字符串。 它从strunicode ,例如"Citt\\xe0".decode("iso8859-1")将为您提供文本“Città”(意大利语为城市), "Citt\\xc3\\xa0".decode("utf-8")也会出现同样的情况"Citt\\xc3\\xa0".decode("utf-8") 可以省略编码,在这种情况下,含义是“使用默认编码”。
  • u.encode(encoding)接受一个文本字符串,并以给定的编码方式构建表示该字符串的字节序列,从而逆转了decode的处理。 它从unicodestr 如上所述,可以省略编码。

使用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

为了解决某些问题,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM