Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using norwegian letters æøå in python

Tags:

python

utf-8

I'm learning python and PyGTK now, and have created a simple Music Organizer. http://pastebin.com/m2b596852 But when it edits songs with the Norwegian letters æ, ø, and å it's just changing them to a weird character.

So is there any good way of opening or encode the names into utf-8 characters?

Two relevant places from the above code:

Read info from a file:

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

Print to 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'
like image 904
ThoKra Avatar asked Mar 19 '09 22:03

ThoKra


People also ask

Does Python work with unicode?

Python's string type uses the Unicode Standard for representing characters, which lets Python programs work with all these different possible characters.

How do you encode an alphabet in Python?

Use the ord() and chr() functions to turn characters to numbers, and vice versa. The numbers for letters and digets correspond to the ASCII standard. To turn that to numbers between 1 and 26, subtract 64, or use ord('@') (also 64).

Are Python strings UTF 8?

In Python, Strings are by default in utf-8 format which means each alphabet corresponds to a unique code point.


3 Answers

You want to start by decoding the input FROM the charset it is in TO utf-8 (in Python, encode means "take it from unicode/utf-8 to some other charset").

Some googling suggests the Norwegian charset is plain-ole 'iso-8859-1'... I hope someone can correct me if I'm wrong on this detail. Regardless, whatever the name of the charset in the following example:

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

In a real-world app, I realize you can't guarantee that the input is norwegian, or any other charset. In this case, you will probably want to proceed through a series of likely charsets to see which you can convert successfully. Both SO and Google have some suggestions on algorithms for doing this effectively in Python. It sounds scarier than it really is.

like image 127
Jarret Hardie Avatar answered Sep 22 '22 23:09

Jarret Hardie


You'd need to convert the bytestrings you read from the file into Unicode character strings. Looking at your code, I would do this in the parsing function, i.e. replace stripnulls with something like this

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

Note that this will only work if the strings in the file are in fact encoded in UTF-8 - if they're in a different encoding, you'd have to use the corresponding decoding function from the codecs module.

like image 43
David Z Avatar answered Sep 22 '22 23:09

David Z


I don't know what encodings are used for mp3 tags but if you are sure that it is UTF-8 then:

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

The line # -*- coding: utf-8 -*- defines your source code encoding and doesn't define encoding used to read from or write to files.

like image 39
jfs Avatar answered Sep 24 '22 23:09

jfs