【问题标题】:Using norwegian letters æøå in python在 python 中使用挪威字母æøå
【发布时间】:2009-03-19 22:54:03
【问题描述】:

我现在正在学习 python 和 PyGTK,并创建了一个简单的音乐管理器。 http://pastebin.com/m2b596852 但是当它用挪威字母 æ、ø 和 å 编辑歌曲时,它只是将它们更改为一个奇怪的字符。

那么有什么好的方法可以打开或将名称编码为 utf-8 字符吗?

上面代码中两个相关的地方:

从文件中读取信息:

def __parse(self, filename):
    "parse ID3v1.0 tags from MP3 file"
    self.clear()
    self['artist'] = 'Unknown'
    self['title'] = 'Unknown'
    try:
        fsock = open(filename, "rb", 0)
        try:
            fsock.seek(-128, 2)
            tagdata = fsock.read(128)
        finally:
            fsock.close()
        if tagdata[:3] == 'TAG':
            for tag, (start, end, parseFunc) in self.tagDataMap.items():
                self[tag] = parseFunc(tagdata[start:end])
    except IOError:
        pass

打印到 sys.stdout 信息:

for info in files:
    try:
        os.rename(info['name'], 
            os.path.join(self.dir, info['artist'])+' - '+info['title']+'.mp3')

        print 'From: '+ info['name'].replace(os.path.join(self.dir, ''), '')
        print 'To:   '+ info['artist'] +' - '+info['title']+'.mp3'
        print
        self.progressbar.set_fraction(i/num)
        self.progressbar.set_text('File %d of %d' % (i, num))
        i += 1
    except IOError:
        print 'Rename fail'

【问题讨论】:

  • tagdata[start:end].decode("utf-8")产生了什么错误?

标签: python utf-8


【解决方案1】:

您想首先将输入从它所在的字符集解码为 utf-8(在 Python 中,编码意味着“将其从 unicode/utf-8 转换为其他字符集”)。

一些谷歌搜索表明挪威字符集是plain-ole 'iso-8859-1'......如果我在这个细节上错了,我希望有人能纠正我。无论如何,以下示例中的字符集名称是什么:

tagdata[start:end].decode('iso-8859-1')

在实际应用中,我意识到您不能保证输入是挪威语或任何其他字符集。在这种情况下,您可能希望通过一系列可能的字符集来查看可以成功转换的字符集。 SO 和 Google 都对在 Python 中有效执行此操作的算法提出了一些建议。听起来比实际更可怕。

【讨论】:

  • 很高兴它有效。出于我自己的好奇心,因为我从您的个人资料中看到您在挪威,所以 ISO-8859-1 是否实际上涵盖了挪威字符集?
  • ISO-8859-1 确实涵盖了挪威字符集。
【解决方案2】:

您需要将从文件中读取的字节串转换为 Unicode 字符串。查看您的代码,我会在解析函数中执行此操作,即将stripnulls 替换为类似的内容

def stripnulls_and_decode(data):
    return codecs.utf_8_decode(data.replace("\00", "")).strip()

请注意,这仅在文件中的字符串实际上以 UTF-8 编码时才有效 - 如果它们采用不同的编码,则必须使用 codecs 模块中的相应解码函数。

【讨论】:

    【解决方案3】:

    我不知道 mp3 标签使用什么编码,但如果您确定它是 UTF-8,那么:

     tagdata[start:end].decode("utf-8")
    

    # -*- coding: utf-8 -*- 行定义了您的源代码编码,并未定义用于读取或写入文件的编码。

    【讨论】:

    • 就像一些附加信息一样,如果您要在代码中使用挪威字符,则可以使用# -*- coding: utf-8 -*-,例如artist_name = 'Bjørn Eidsvåg'
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2011-02-21
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多