Использование норвежских букв æøå в python - PullRequest
5 голосов
/ 20 марта 2009

Сейчас я изучаю Python и PyGTK и создал простой Music Organizer. 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 info:

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'

Ответы [ 3 ]

8 голосов
/ 20 марта 2009

Вы хотите начать с декодирования ввода из набора символов, который находится в TO utf-8 (в Python кодирование означает «перенести его из unicode / utf-8 в другой набор символов»).

Некоторые прибегают к поиску в Google, что норвежская кодировка - это обычный «iso-8859-1» ... Я надеюсь, что кто-то может исправить меня, если я ошибаюсь в этом. Независимо от того, какое имя кодировки указано в следующем примере:

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

В реальном приложении я понимаю, что вы не можете гарантировать, что ввод норвежский или любой другой кодировке. В этом случае вы, вероятно, захотите пройти серию вероятных кодировок, чтобы увидеть, какие из них можно успешно преобразовать. И у SO, и у Google есть некоторые предложения по алгоритмам для эффективной работы в Python. Звучит страшнее, чем есть на самом деле.

1 голос
/ 20 марта 2009

Я не знаю, какие кодировки используются для mp3-тегов, но если вы уверены, что это UTF-8, тогда:

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

Строка # -*- coding: utf-8 -*- определяет кодировку исходного кода и не определяет кодировку, используемую для чтения или записи в файлы.

1 голос
/ 20 марта 2009

Вам необходимо преобразовать строки байтов, которые вы читаете из файла, в строки символов Unicode. Глядя на ваш код, я бы сделал это в функции синтаксического анализа, т.е. заменил stripnulls на что-то вроде

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

Обратите внимание, что это будет работать только в том случае, если строки в файле фактически закодированы в UTF-8 - если они в другой кодировке, вам придется использовать соответствующую функцию декодирования из модуля codecs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...