将未知编码的字符串转换为 UTF-8

Convert string of unknown encoding to UTF-8

我正在使用来自第三方的文本回复 API。该文本采用我不知道的编码。我使用 python3 中的文本并想将编码更改为 UTF-8。

这是我得到的内容示例:

Danke
"Träume groß"
🙌ðŸ¼
Super Idee!!!

通过手动执行以下操作,我能够使乱七八糟的字符变得可读:

  1. 在 Notepad++ 中打开新文档
  2. 通过 Encoding 菜单将文档编码切换为 ANSI
  3. 粘贴内容
  4. 再次使用编码菜单,这次切换到UTF-8
  5. 现在文字清晰易读,如下所示

正确内容:

Danke
"Träume groß"

Super Idee!!!

我想在 python3 中重复这个过程,但很难做到。从记事本工作流程中,我收集到不应转换编码,而应使用不同的编码解释现有字符。那是因为如果我在 Encoding 菜单中 select Convert to UTF-8,它不起作用。

根据我在 SO 上阅读的内容,有 encodedecode 方法可以做到这一点。另外 ANSI 并不是真正的编码,而是指当前机器使用的标准编码。这很可能是 cp1525 在我的 windows 机器上。我弄乱了 cp1252utf-8 的所有组合作为源 and/or 目标,但无济于事。我总是以 UnicodeEncodeError.

结尾

我也尝试过使用 chardet 模块来确定我的输入字符串的编码,但它需要 bytes 作为输入并且 b'🙌ðŸ¼'SyntaxError: bytes can only contain ASCII literal characters. 拒绝

您可以使用bytes()将字符串转换为字节,然后使用.decode()

对其进行解码
>>> bytes("Träume groß", "cp1252").decode("utf-8")
'Träume groß'

chardet 在这里可能会有用 -

直接引用 docs

import urllib.request
rawdata = urllib.request.urlopen('http://yahoo.co.jp/').read()
import chardet
chardet.detect(rawdata) {'encoding': 'EUC-JP', 'confidence': 0.99}

"Träume groß" 暗示您得到了最初编码为 utf-8 的内容,但您的进程将其读取为 cp1252。

一种可能的方法是将您的字符串编码回 cp1252,然后将其正确解码为 utf-8:

print('"Träume groß"'.encode('cp1252').decode('utf8'))

按预期给出:

"Träume groß"

但这只是一种解决方法。正确的解决办法是了解你在哪里读取了原始字节为cp1252并直接在那里使用utf8转换。