gpt4 book ai didi

python - 如何解码cp1252字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:53 30 4
gpt4 key购买 nike

我得到一个带有 eyeD3 的 mp3 标签 (ID V1),我想了解它的编码。这是我的尝试:

>>> print(type(mp3artist_v1))
<type 'unicode'>

>>> print(type(mp3artist_v1.encode('utf-8')))
<type 'str'>

>>> print(mp3artist_v1)
Zåìôèðà

>>> print(mp3artist_v1.encode('utf-8').decode('cp1252'))
ZåìôèðÃ

>>> print(u'Zемфира'.encode('utf-8').decode('cp1252'))
Zемфира

如果我使用 online tool要解码该值,它表示可以通过更改编码 CP1252 → UTF-8 将值 Zȵмфира 转换为正确的值 Zемфира 和值 Zåìôèðà 通过改变编码如 CP1252 → CP1251

我应该怎么做才能从 mp3artist_v1 获取 Zемфира.encode('cp1252').decode('cp1251') 效果很好,但我怎么能自动理解可能的编码(只有 3 种编码是可能的 - cp1251cp1252, utf-8? 我打算使用以下代码:

def forceDecode(string, codecs=['utf-8', 'cp1251', 'cp1252']):
for i in codecs:
try:
print(i)
return string.decode(i)
except:
pass
print "cannot decode url %s" % ([string])

但这没有帮助,因为我应该先用一个字符集编码,然后再用另一个字符集解码。

最佳答案

这个

s = u'Zåìôèðà'
print s.encode('latin1').decode('cp1251')
# Zемфира

解释:Zåìôèðà被误认为是一个unicode字符串,而它实际上是一个字节序列,即cp1251中的Zемфира。通过应用 encode('latin1'),我们将这个“unicode”字符串转换回字节,使用代码点数字作为字节值,然后将这些字节转换回 unicode,告诉解码器我们正在使用 cp1251。

至于自动解码,以下强力方法似乎适用于您的示例:

import re, itertools

def guess_decode(s):
encodings = ['cp1251', 'cp1252', 'utf8']

for steps in range(2, 10, 2):
for encs in itertools.product(encodings, repeat=steps):
r = s
try:
for enc in encs:
r = r.encode(enc) if isinstance(r, unicode) else r.decode(enc)
except (UnicodeEncodeError, UnicodeDecodeError) as e:
continue
if re.match(ur'^[\w\sа-яА-Я]+$', r):
print 'debug', encs, r
return r

print guess_decode(u'Zемфира')
print guess_decode(u'Zåìôèðà')
print guess_decode(u'ZåìôèðÃ\xA0')

结果:

debug ('cp1252', 'utf8') Zемфира
Zемфира
debug ('cp1252', 'cp1251') Zемфира
Zемфира
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Zемфира
Zемфира

关于python - 如何解码cp1252字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326531/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com