确定python中Unicode字符串的解码方法的最佳方法是什么



我想知道如何确定unicode的编码。

我知道我在某个地方读到过这件事,我只是不记得这是否可能,但我想相信有办法。

假设我有一个latin-1编码的unicode,我想用解码时使用的相同编码对其进行动态编码…

坦率地说,在使用它之前,我想把它变成一个utf-8 unicode,而不会弄乱字符。

I.e:

latin1_unicode = 'åäö'.decode('latin-1')
utf8_unicode = latin.encode('latin-1').decode('utf-8')

如果在"确定unicode的编码"中,"unicode"是python数据类型,则不能执行此操作,因为"encoding"指的是输入字符串时表示字符串的原始字节模式(例如,从文件、数据库中读取,您可以命名它)。当它变成python"unicode"类型(内部表示)时,字符串要么已经在行后解码,要么由于字节序列与系统编码不一致而引发解码异常。

Shadyabhi的答案指的是(常见的)情况,在这种情况下,你从文件中读取字节(你很可能会将其插入字符串,而不是python unicode字符串),并需要猜测它们保存的编码。严格地说,你不能有一个"latin1 unicode python字符串":unicode python字符串没有编码(编码可以定义为将字符转换为字节模式的过程,解码可以定义为相反的过程;解码后的sring则没有编码-尽管它可以通过多种方式进行编码以用于存储/外部表示)。

例如,在我的机器上:

In [35]: sys.stdin.encoding
Out[35]: 'UTF-8'
In [36]: a='è'.decode('UTF-8')
In [37]: b='è'.decode('latin-1')
In [38]: a
Out[38]: u'xe8'
In [39]: b
Out[39]: u'xc3xa8'
In [41]: sys.stdout.encoding
Out[41]: 'UTF-8'
In [42]: print b #it's garbage
è
In [43]: print a #it's OK
è

这意味着,在您的示例中,如果默认编码恰好是UTF-8、UTF-16或与latin1不同的任何编码,那么latin1_unicode将包含垃圾。

所以你(可能)想做的是:

  1. 确定数据源的编码-也许可以使用Shadyabhi的方法之一
  2. 根据(1)对数据进行解码,将其保存在python unicode字符串中
  3. 使用原始编码(如果这符合您的需求)或您选择的其他编码进行编码

最新更新