unikod

Jacek Konieczny jajcus w pld.org.pl
Śro, 31 Gru 2003, 21:15:14 CET


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
-------------- następna część ---------
#!/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()



Więcej informacji o liście dyskusyjnej pld-devel-pl