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

Python 如何检查是否已成功地在utf-8中编码,python,Python,给一串 u ='abc' 哪种语法适合编码为utf8 u.encode('utf-8') 或 我怎么知道我已经在utr-8中编码了呢?第一个解决方案: 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" 第二种解决方案:

给一串

u ='abc'
哪种语法适合编码为utf8

u.encode('utf-8')

我怎么知道我已经在utr-8中编码了呢?

第一个解决方案:

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"
第二种解决方案:

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"
第一个解决方案:

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"
第二种解决方案:

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"

首先,如果您在谈论Python2或Python3,您需要进行区分,因为unicode处理是这两个版本之间最大的区别之一

Python 2 unicode类型包含文本字符 str包含8位字节的序列,有时表示某些未指定编码的文本 s、 一旦给定了字节使用的编码,decodeencoding将获取一个字节序列并从中构建一个文本字符串。它从str到unicode,例如Citt\xe0.decodeiso8859-1将为city提供文本Cittá意大利语,Citt\xc3\xa0.decodeutf-8也将如此。编码可以省略,在这种情况下,含义是使用默认编码。 u、 encodeencoding获取一个文本字符串,并构建以给定编码表示它的字节序列,从而反转解码处理。它从unicode到str。如上所述,编码可以省略。 使用Python处理unicode时的一部分困惑是,该语言试图变得有点太聪明,并且自动执行操作

例如,您也可以在str对象上调用encode,其含义是在使用默认编码时对解码这些字节产生的文本进行编码,最终使用指定编码或默认编码(如果未指定)

类似地,您也可以对unicode对象调用decode,这意味着在使用默认编码时解码来自此文本的字节,最终使用指定的编码

例如,如果我写

u"Citt\u00e0".decode("utf-8")
Python给出了一个错误:

UnicodeEncodeError:“ascii”编解码器无法在中对字符u'\xe0'进行编码 位置3:序号不在范围128中

注意:错误是关于编码失败,而我要求解码。原因是,我要求解码的文字废话,因为这是已经解码。。。它是文本,Python决定首先使用ascii编码对其进行编码,但失败了。IMO最好不要对unicode对象进行解码,也不要对字符串对象进行编码:错误消息会更清楚

更令人困惑的是,在Python2中,str用于未编码的字节,但它也用于文本,例如字符串文本就是str对象

Python 3 为了解决一些问题,Python3做了一些关键更改

str表示文本,包含unicode字符,字符串文本为unicode文本 unicode类型不再存在 字节类型用于8位字节序列,该序列可能表示某些未指定编码中的文本 例如在Python3中

'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进行解码永远不会产生错误任何字节序列都是有效的,但如果使用另一种编码,它当然会给您提供无意义的文本。

首先,如果您谈论的是Python 2或Python 3,您需要进行区分,因为unicode处理是两者之间最大的区别之一版本

Python 2 unicode类型包含文本字符 str包含8位字节的序列,有时表示某些未指定编码的文本 s、 一旦给定了字节使用的编码,decodeencoding将获取一个字节序列并从中构建一个文本字符串。它从str到unicode,例如Citt\xe0.decodeiso8859-1将为city提供文本Cittá意大利语,Citt\xc3\xa0.decodeutf-8也将如此。编码可以省略,在这种情况下,含义是使用默认编码。 u、 encodeencoding接受文本字符串和bu ilds在给定编码中表示它的字节序列,从而反转解码处理。它从unicode到str。如上所述,编码可以省略。 使用Python处理unicode时的一部分困惑是,该语言试图变得有点太聪明,并且自动执行操作

例如,您也可以在str对象上调用encode,其含义是在使用默认编码时对解码这些字节产生的文本进行编码,最终使用指定编码或默认编码(如果未指定)

类似地,您也可以对unicode对象调用decode,这意味着在使用默认编码时解码来自此文本的字节,最终使用指定的编码

例如,如果我写

u"Citt\u00e0".decode("utf-8")
Python给出了一个错误:

UnicodeEncodeError:“ascii”编解码器无法在中对字符u'\xe0'进行编码 位置3:序号不在范围128中

注意:错误是关于编码失败,而我要求解码。原因是,我要求解码的文字废话,因为这是已经解码。。。它是文本,Python决定首先使用ascii编码对其进行编码,但失败了。IMO最好不要对unicode对象进行解码,也不要对字符串对象进行编码:错误消息会更清楚

更令人困惑的是,在Python2中,str用于未编码的字节,但它也用于文本,例如字符串文本就是str对象

Python 3 为了解决一些问题,Python3做了一些关键更改

str表示文本,包含unicode字符,字符串文本为unicode文本 unicode类型不再存在 字节类型用于8位字节序列,该序列可能表示某些未指定编码中的文本 例如在Python3中

'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进行解码永远不会引发错误任何字节序列都是有效的,但如果使用另一种编码的字节,它当然会给你无意义的文本。

-由于连字符下划线转换,utf-8自动成为utf_8编解码器的有效别名,而utf8在别名列表中,因此两者都完全可以。如果编码失败,则会出现异常。否则你可以假设它成功了由于连字符下划线转换,utf-8自动成为utf_8编解码器的有效别名,而utf8在别名列表中,因此两者都完全可以。如果编码失败,则会出现异常。否则你可以假设它成功了。非常感谢!我现在非常清楚这个概念:非常感谢!我现在非常清楚这个概念: