在Python中如何确定Unicode字符串的解码方法?

4 投票
1 回答
2327 浏览
提问于 2025-04-17 11:08

我在想怎么确定一个unicode的编码方式。

我记得我在某个地方读到过这个,但我不太记得是否真的有办法,不过我想相信是有的。

假设我有一个latin-1编码的unicode,我想动态地用解码时用的相同编码来编码它……

老实说,我想把它转换成utf-8的unicode,这样在处理之前不会搞乱字符。

也就是说:

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

1 个回答

1

如果在“确定一个unicode的编码”中,提到的“unicode”是指Python的数据类型,那么你是无法做到的,因为“编码”是指当字符串被输入时(比如从文件、数据库等读取)所代表的原始字节模式。当它变成Python的'unicode'类型(内部表示)时,字符串要么已经在后台被解码,要么因为字节序列与系统编码不匹配而抛出了一个解码异常。

Shadyabhi的回答提到了一种常见情况:你从文件中读取字节(这些字节可能被放入一个字符串中,而不是Python的unicode字符串),然后需要猜测它们是以什么编码保存的。严格来说,你不能有一个“latin1 unicode python字符串”:unicode的Python字符串没有编码(编码可以理解为将字符转换为字节模式的过程,而解码是反向过程;因此,一个解码后的字符串没有编码——不过它可以以多种方式进行编码,以便存储或外部表示)。

举个例子,在我的机器上:

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'\xc3\xa8'
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. 使用原始编码(如果这符合你的需求)或你选择的其他编码进行编码。

撰写回答