On Wed, Dec 31, 2003 at 05:09:27PM +0100, Andrzej Krzysztofowicz wrote:
> > Mogę spróbować zrobić cały skrypt "validujący" Unicode, tylko napisz co
> > dokładnie powinien on robić.
> 
> Sprawdzac, czy plik nie zawiera kombinacji znakow nielegalnych w UTF-8
> (za "nielegalne" moze tez traktowac zakres "user-defined", ale nie jest to
> konieczne), badz nie reprezentujacych zadnego znaku (jeszcze nieprzypisanych).
> 
> Chcialbym, zeby wypisal linie zawierajace bledy, dobrze gdyby podal nry
> linii i pozycje nieprawidlowego znaku w kazdej z nich.

Skrypt w załączniku.
 
> Musi dzialac na zasobach Ra.

Będzie działać (powinien), ale z dwoma ograniczeniami:
python-2.2 (który jest w Ra) ma wkompilowaną starą wersję Unicode Database,
więc może niektórych znaków nie znać (ale nie sądze, żebyś ich
potrzebował). No i w Ra python bysł skompilowany z 16-bitową obsługą
unicode, więc siłą rzeczy kody > 65535 będą uznane za błędne.

Pozdrowienia,
        Jacek
#!/usr/bin/python

import sys
import unicodedata

if len(sys.argv) not in (2,3):
        print "Usage:"
        print "  %s [encoding] <file>" % (sys.argv[0],)

if len(sys.argv)>2:
        encoding=sys.argv[1]
        filename=sys.argv[2]
else:
        encoding="utf-8"
        filename=sys.argv[1]

i=0
f=file(sys.argv[1])
for l in f.xreadlines():
        i+=1
        try:
                ul=unicode(l,encoding,"strict")
        except UnicodeError:
                ul=unicode(l,encoding,"replace")
                print "Unicode error in line %i: %r" % (i,l)
                print "at unicode character position: %i" % (ul.find(u'\ufffd'),)
                print "Decoded string: %r" % (ul,)
        else:
                j=0
                for c in ul:
                        if ord(c)<32:
                                # ignore control characters
                                continue
                        try:
                                unicodedata.name(c)
                        except ValueError:
                                print "Unknown character in line %i: %r" % (i,l)
                                print "at unicode character position: %i" % (j,)
                                print "Decoded line: %r" % (ul,)
                        j+=1
f.close()


__________________________________________________________
nie pytaj co inni zrobili dla pld, pomysl ile sam zrobiles

Odpowiedź listem elektroniczym