如何将字符串从一个代码页转换为另一个代码页?

How to convert a string from one codepage to another?

我需要将此字符串转换为可读的内容。

'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'

它没有.decode方法,只有.encode

最糟糕的是我不确定这到底是什么代码页。可能是 "cp1251".

我在 python 3,但也欢迎回答 python 2。我不太明白到底发生了什么变化。

Probably it's "cp1251".

关闭...大概。

由于它充满了低代理项,我们可以看出它是使用 errors='surrogateescape' 解码的,所以首先我们需要使用它进行编码。

>>> 'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'.encode('latin-1', errors='surrogateescape')
b'Old_video/\xc2\xe8\xe4\xe5\xee\xef\xf0\xe8\xea\xee\xeb\xfb'

现在我们可以尝试正确解码它了。

>>> 'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'.encode('latin-1', errors='surrogateescape').decode('cp1251')
'Old_video/Видеоприколы'

如果文件名就是这样,那么恭喜你,你猜对了。

In Python 3 you can only .decode() bytes. – kichik Nov 8 '17 at 0:27

正确。 .decode 会将字节列表转换为字符串。 所以,如果你有一个字符串,你必须先用.encode()把它转换成字节,然后.decode()那个操作的结果

因此,例如,如果您有一些 utf-8 文本字符串并希望转换为代码页 1252(用于西欧计算机),

text = sourcetext.encode('cp1252').decode('utf-8')

一般来说应该是:

source_codepage = 'utf-8'    # or whatever the current format is
target_codepage = 'cp1252'   # or whatever format you like

newtext = sourcetext.encode(target_codepage).decode(source_codepage)

其中 source_codepage 和 target_codepage 是两个字符串,分别包含原始文本编码的名称和所需的名称。

可在此处找到 Python 中可用的代码页字符串的完整列表:https://docs.python.org/3/library/codecs.html#standard-encodings