<< July 2006 >>
Sun Mon Tue Wed Thu Fri Sat
 01
02 03 04 05 06 07 08
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31



  • I mainly blog things related to NetBSD

  • my PGP Key is 0xB3FBAE33

  • my homepage


  • Profile

    Technorati Profile

  • If you want to be updated on this weblog Enter your email here:



    rss feed



    2006.07.26
    Perl und UTF8

    Irgendwie leidet mein Hirn grade gewaltig. Kein Wunder bei 33,7°C in der Wohnung.

    Ich lasse grade mehrere Lemma-Strecken aus der Datenbank auslesen und portionsweise in Dateien schreiben.
    Dazu dienen zwei einfache Abfragen und eine Schleife.

    In der ersten Abfrage wird mit select count(lemma) from swliste where suchform >= '$anfang' and suchform <= '$ende' and loeschen is false; die Anzahl der betroffenen Lemmata abgefragt.

    Diese Anzahl wird dann durch die Portionsgröße geteilt um die Anzahl der Runden zu bekommen.
    Dann läuft eine Schleife durch und fragt die Lemmata ab, dazu wird mit LIMIT und OFFSET immer schön weitergetrippelt: SELECT lemma,oid,woerterbuecher from swliste where suchform >= '$anfang' and suchform <= '$ende' and loeschen is false order by suchform limit $lim offset $off;

    $lim ist die Portionsgröße und $off das Offset, also $lim mal Runde. Eigentlich ganz simpel und funktioniert soweit ganz gut.

    Die Dateinamen werden nach dem Muster Rundennummer-erstesLemma-letztesLemma.xml gebildet.
    Da es mit UTF8 in Dateinamen auf NetBSD und den Windows-Kisten Probleme gab, lasse ich den Dateinamen transliterieren.

    Und zwar mit einem stupiden Filter, der die kyrillischen Buchstaben in lateinische umwandelt.


    for ( $i=0; $i$result=~s/А/A/gi;
    $result=~s/Б/B/gi;
    $result=~s/В/V/gi;
    $result=~s/Г/G/gi;
    $result=~s/Д/D/gi;
    $result=~s/Е/E/gi;
    $result=~s/Ж/H/gi;
    $result=~s/З/Z/gi;
    $result=~s/И/I/gi;
    $result=~s/Й/J/gi;
    $result=~s/К/K/gi;
    $result=~s/Л/L/gi;
    $result=~s/М/M/gi;
    $result=~s/Н/N/gi;
    $result=~s/О/O/gi;
    $result=~s/П/P/gi;
    $result=~s/Р/R/gi;
    $result=~s/С/S/gi;
    $result=~s/Т/T/gi;
    $result=~s/У/U/gi;
    $result=~s/Ф/F/gi;
    $result=~s/Х/X/gi;
    $result=~s/Ц/C/gi;
    $result=~s/Ч/Q/gi;
    $result=~s/Ш/W/gi;
    $result=~s/Щ//gi;
    $result=~s/Ъ//gi;
    $result=~s/Ы/Y/gi;
    $result=~s/Ь//gi;
    $result=~s/Э/A/gi;
    $result=~s/Ю/U/gi;
    $result=~s/Я/O/gi;
    $result=~s/а/a/gi;
    $result=~s/б/b/gi;
    $result=~s/в/v/gi;
    $result=~s/г/g/gi;
    $result=~s/д/d/gi;
    $result=~s/е/e/gi;
    $result=~s/ж/h/gi;
    $result=~s/з/z/gi;
    $result=~s/и/i/gi;
    $result=~s/й/j/gi;
    $result=~s/к/k/gi;
    $result=~s/л/l/gi;
    $result=~s/м/m/gi;
    $result=~s/н/n/gi;
    $result=~s/о/o/gi;
    $result=~s/п/p/gi;
    $result=~s/р/r/gi;
    $result=~s/с/s/gi;
    $result=~s/т/t/gi;
    $result=~s/у/u/gi;
    $result=~s/ф/f/gi;
    $result=~s/х/x/gi;
    $result=~s/ц/c/gi;
    $result=~s/ч/q/gi;
    $result=~s/ш/w/gi;
    $result=~s/щ//gi;
    $result=~s/ъ/ss/gi;
    $result=~s/ы/y/gi;
    $result=~s/ь/+/gi;
    $result=~s/э/a/gi;
    $result=~s/ю/o/gi;
    $result=~s/я//gi;
    }



    Wenn ich das aber in ein Funktion oder eine Modul packe, funktioniert es nicht mehr, schon die Übergabe des Strings scheint zu scheitern. Ein print $_; gibt nichts aus. Rumgefummel mit use utf8; oder use encode; Encode::_utf8_on(); hat auch nicht geholfen. Nur wenn ich den Filter direkt in der Datei laufen lasse, funktioniert es.

    Komisch.

    Posted at 08:34 pm by 0xb3fbae33

     

    Leave a Comment:

    Name


    Homepage (optional)


    Comments




    Previous Entry Home Next Entry