首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解码cp1252字符串?

如何解码cp1252字符串?
EN

Stack Overflow用户
提问于 2014-04-28 01:22:21
回答 1查看 14.5K关注 0票数 3

我正在得到一个mp3标签(ID V1)与eyeD3,并希望了解其编码。以下是我的尝试:

代码语言:javascript
复制
>>> 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对值进行解码,它表示可以通过更改编码Zемфира来将值Zемфира转换为正确的值CP1252 → UTF-8,并通过更改编码(如CP1252 → CP1251 )来转换值Zåìôèðà

我应该怎么做才能从mp3artist_v1中获取Zемфира.encode('cp1252').decode('cp1251')工作得很好,但我如何自动理解可能的编码(只有3种编码- cp1251cp1252utf-8?我计划使用以下代码:

代码语言:javascript
复制
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]) 

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-28 03:06:03

代码语言:javascript
复制
s = u'Zåìôèðà'
print s.encode('latin1').decode('cp1251')
# Zемфира

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

至于自动解码,下面的暴力破解方法似乎适用于你的例子:

代码语言:javascript
复制
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')

结果:

代码语言:javascript
复制
debug ('cp1252', 'utf8') Zемфира
Zемфира
debug ('cp1252', 'cp1251') Zемфира
Zемфира
debug ('cp1252', 'utf8', 'cp1252', 'cp1251') Zемфира
Zемфира
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23326531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档