nilsFK/py-privatekonomi

Hantering av unicode

nilsFK opened this issue · 0 comments

Viss hantering av unicode är helt enkelt inkorrekt. När vi läser in filer behöver vi få ordentlig utf-8 att jobba med. Men om vi exempelvis konverterar samples/swedbank/sample2 till ANSI (i Notepad++) och kör igenom testen (test_swedbank.py) medför detta att vi får diverse fel i parsningen:

[...]
\swedbank_parser.py", line 30, in __parse_clnr
    headers = re.findall(r'(\w+\s*)', headers.decode('utf-8'), re.UNICODE)
  File "C:\Python\Lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf6 in position 52: invalid
start byte

Om filen vi jobbar med är i utf-8 så går testen igenom utan problem. Det beror på att vi i vår decoding förväntar oss att headers (läst från filen sample2) är encodad i utf-8. I det reguljära uttrycket som vi applicerar behövs för att kunna bestämma en korrekt längd på rubrikerna (inte byte för byte, utan tecken för tecken). Vare sig vi jobbar med ANSI eller UTF-8 eller UTF-8 utan BOM så borde parsningen rulla igenom.

Lösningen är troligtvis att läsa och skriva till filen via codecs-modulen för att få korrekt utf8-formaterad sträng. Sen kan vi köra det igenom decode (precis som vi gör nu) för att få en korrekt representation av strängen som inte faller på decode.

Matnyttigt (kolla svaret av Tim Swast):
http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python

Hjälp på vägen: