Problem mit encoding und mp3 id3 tags

22/09/2008 - 22:27 von Florian Lindner | Report spam
Hallo,

ich habe mir ein kleines Skript geschrieben, welches meine als FLAC
gerippten CDs nach mp3 konvertiert. Leider treten Probleme (bei vlc
und iTunes) auf. Umlaute in den Tags werden nicht korrekt dargestellt.

Sowohl die Programme iTunes und vlc als auch mein Skript laufen unter
LANG=de_DE.UTF-8 unter Mac OS X 10.5

Den Wert des Tags hole ich mir mit:

def getTagValue(path, tag):
""" Gets a specific tag from path. """
cmd = 'metaflac --show-tag="%s" "%s"' % (tag, path)
p = Popen(cmd, stdout=PIPE, shell=True)
return p.stdout.readline()[len(tag)+1:].strip()

Die Tags werden mit beim Enkodieren an lame übergeben.

Ich habe schon probiert den String mit .encode("latin_1") zu
behandeln, aber:

ret.append('"' + getTagValue(path, tag[1]).encode("latin_1") +
'"')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
16: ordinal not in range(128)

oder auch andere Encodings.

Was könnte ich da noch ausprobieren? Ich weiß, dass es evtl. ein wenig
offtopic ist, da das Problem auch bei den Encoding der Tags liegen
kann. Ich hoffe Ihr vergebt mir...

Danke,

Florian
 

Lesen sie die antworten

#1 Diez B. Roggisch
22/09/2008 - 23:18 | Warnen spam
Florian Lindner schrieb:
Hallo,

ich habe mir ein kleines Skript geschrieben, welches meine als FLAC
gerippten CDs nach mp3 konvertiert. Leider treten Probleme (bei vlc
und iTunes) auf. Umlaute in den Tags werden nicht korrekt dargestellt.

Sowohl die Programme iTunes und vlc als auch mein Skript laufen unter
LANG=de_DE.UTF-8 unter Mac OS X 10.5

Den Wert des Tags hole ich mir mit:

def getTagValue(path, tag):
""" Gets a specific tag from path. """
cmd = 'metaflac --show-tag="%s" "%s"' % (tag, path)
p = Popen(cmd, stdout=PIPE, shell=True)
return p.stdout.readline()[len(tag)+1:].strip()

Die Tags werden mit beim Enkodieren an lame übergeben.

Ich habe schon probiert den String mit .encode("latin_1") zu
behandeln, aber:

ret.append('"' + getTagValue(path, tag[1]).encode("latin_1") +
'"')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
16: ordinal not in range(128)

oder auch andere Encodings.

Was könnte ich da noch ausprobieren? Ich weiß, dass es evtl. ein wenig
offtopic ist, da das Problem auch bei den Encoding der Tags liegen
kann. Ich hoffe Ihr vergebt mir...



Bevor man etwas encodiert muss man es erstmal *dekodieren*.
Grundsaetzlich gilt: Daten die man einliest muessen dekodiert werden,
welche die man ausgibt enkodiert.

Wenn du encode auf einem Bytestring aufrufst, versucht python den
erstmal zu unicode zu machen - was natuerlich fehlschlaegt, da dann
ascii als default-encoding verwand wird.

Du musst also sowas hier machen:

tag = getTagValue() # PEP-8 lesen waere auch gut
try:
utag = tag.decode("utf-8")
except UnicodeError:
utag = tag.decode("latin1")

Dann kannst du utag in dein gewuenschtes encoding wandeln - latin1 zb.

Die Lektuere von diversen Unicode+Python-Tutorials kann sicher nicht
schaden - zB das hier sieht ganz gut aus:

http://www.p-nand-q.com/python/unicode_faq.html



Diez

Ähnliche fragen