将未知编码的字符串转换为 UTF-8
Convert string of unknown encoding to UTF-8
我正在使用来自第三方的文本回复 API。该文本采用我不知道的编码。我使用 python3 中的文本并想将编码更改为 UTF-8。
这是我得到的内容示例:
Danke
"Träume groß"
🙌ðŸ¼
Super Idee!!!
通过手动执行以下操作,我能够使乱七八糟的字符变得可读:
- 在 Notepad++ 中打开新文档
- 通过 Encoding 菜单将文档编码切换为
ANSI
- 粘贴内容
- 再次使用编码菜单,这次切换到
UTF-8
- 现在文字清晰易读,如下所示
正确内容:
Danke
"Träume groß"
Super Idee!!!
我想在 python3 中重复这个过程,但很难做到。从记事本工作流程中,我收集到不应转换编码,而应使用不同的编码解释现有字符。那是因为如果我在 Encoding 菜单中 select Convert to UTF-8,它不起作用。
根据我在 SO 上阅读的内容,有 encode
和 decode
方法可以做到这一点。另外 ANSI
并不是真正的编码,而是指当前机器使用的标准编码。这很可能是 cp1525
在我的 windows 机器上。我弄乱了 cp1252
和 utf-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转换。
我正在使用来自第三方的文本回复 API。该文本采用我不知道的编码。我使用 python3 中的文本并想将编码更改为 UTF-8。
这是我得到的内容示例:
Danke
"Träume groß"
🙌ðŸ¼
Super Idee!!!
通过手动执行以下操作,我能够使乱七八糟的字符变得可读:
- 在 Notepad++ 中打开新文档
- 通过 Encoding 菜单将文档编码切换为
ANSI
- 粘贴内容
- 再次使用编码菜单,这次切换到
UTF-8
- 现在文字清晰易读,如下所示
正确内容:
Danke
"Träume groß"
Super Idee!!!
我想在 python3 中重复这个过程,但很难做到。从记事本工作流程中,我收集到不应转换编码,而应使用不同的编码解释现有字符。那是因为如果我在 Encoding 菜单中 select Convert to UTF-8,它不起作用。
根据我在 SO 上阅读的内容,有 encode
和 decode
方法可以做到这一点。另外 ANSI
并不是真正的编码,而是指当前机器使用的标准编码。这很可能是 cp1525
在我的 windows 机器上。我弄乱了 cp1252
和 utf-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转换。