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

4

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

我记得我在某个地方看到过相关内容,只是不太确定是否有可能,但我希望能找到一种方法。

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

坦白说,我想将其转换为utf-8 unicode,在不影响之前的字符的情况下处理它。

例如:

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

这是 Python 3 吗?否则,你所说的“unicode”是什么意思? - cha0site
我指的是Unicode实例。不,这不是Python 3。我想知道如何确定Unicode字符串的编码方式,无论是通过其代码点以及它选择使用给定编码来表示字符的方式,还是通过其他任何方式。只要有可能的方法。 - JayDL
1
完全没有意义询问“一个Unicode [字符串]的编码”。根据定义,Unicode字符串没有被编码。 - Daniel Roseman
1
@JayLev,那完全是胡说八道。一旦你将字符串解码为Unicode,它就是Unicode。它没有任何关于之前的“记忆”,并且不在乎之后你将其编码为什么格式。如果你想要一个UTF-8字符串,你可以将其编码为UTF-8格式。这不会“搞砸”它。 - Daniel Roseman
1
我自己表达不清楚了,我的错。实际上我得到的是一个解码后的Unicode,但是使用了错误的编码进行解码。所以我提出了一个问题,举了一个例子,说明我已经有了这个Unicode字符串,试图找出如何修复它。 - JayDL
显示剩余4条评论
1个回答

1
如果在“确定Unicode的编码”中,“Unicode”是Python数据类型,则无法完成此操作,因为“编码”指的是表示输入字符串的原始字节模式(例如从文件、数据库等读取)。当它成为Python“unicode”类型(一种内部表示)时,该字符串已经在幕后解码或因字节序列与系统编码不符而引发解码异常。
Shadyabhi的答案涉及了一个常见情况,即您正在从文件中读取字节(您可能会将其塞入一个“string”中 - 而不是Python Unicode字符串),并且需要猜测它们保存在哪种编码中。严格来说,您不能拥有“latin1 unicode python string”: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. 使用原始编码(如果符合您的需求)或其他您选择的编码对其进行编码。

我知道这一切。我想知道如何找到“解码方法”。我知道为什么latin1解码的unicode看起来像垃圾,因为默认编码是utf-8。但我从不同的来源获取Unicode字符串,它们使用不同的编码。这就是为什么我必须弄清楚它们是如何解码的,以便我不会有一堆看起来像垃圾的字符串。我可以更改不同来源的编码以使其工作,但我希望它能够动态地工作。 - JayDL
一旦您拥有了Unicode字符串,源编码的信息就不存在了。我不明白您所说的“看起来像垃圾”的意思。Unicode字符串是Unicode字符串,可以正确地表示每个字符。为什么不退后几步,逐步向我们展示您想要做什么 - Karl Knechtel
我不会隐瞒我最近才学习如何处理Unicode和不同的编码方式。所以我的理解可能有些偏差。问题是,我有两个数据库,但它们的文本字段排序方式不同。因此,当我在ORM(SQLAlchemy)中将字段类型定义为Unicode时,相同的文本会得到不同的结果。它们被存储在不同的方式中,但是我整个系统都使用Unicode。因此,我想要通过查询更新字段或通过检查它们的编码/解码方式来纠正这些值。 - JayDL
如果“排序”(即字符串排序)是您真正关心的问题,那么到目前为止我们所说的有关编码的一切都是完全无关的(或者最多只是间接相关)。 - Alien Life Form

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接