[Gfoss] importazione shape con caratteri misti latino/cirillico in SpatiaLite

a.furieri a lqt.it a.furieri a lqt.it
Mer 11 Feb 2015 18:45:47 CET


Ciao Matteo,

il probeblema del charset non e' poi troppo complesso, basta solo
avere ben presente come funziona.

nella notte dei tempi (prima di MS-DOS) c'era solo ASCII (o piu'
di preciso l'US-ASCII); funzionava benissimo, ma poteva codificare
solo ed esclusisavamente l'alfabeto anglo-americano: lettere
maiuscole e minuscole, numeri, parentesi ed interpuzioni.
gia' le vocali accentante italiane erano escluse.

con MS-DOS arrivano le "code pages"; nascono cosi' un visibilio
di nuovi charsets nazionali: c'e' quello tedesco con gli umlaut,
quello latino con le vocali accentate, quello cirillico, graco,
ebraico etc.
restano ancora fuori le lingue asiatiche (cinese e giapponese),
perche' non sono alfabatiche ma sillabiche; hanno decine di migliaia
di simboli ed in un solo byte non ci stanno proprio.
naturalmente nasce anche una enorme confusione, perche' a questo
punto il medesimo byte puo' significare tante lettere diverse;
per conservare fedelmente le informazioni occorre sempre sapere
con estrema precisione quale particolare tabella dei caratteri
deve essere utilizzata.

in tempi piu' recenti finalmente arrivano i charsets universali:
tipicamente Unicode ed UTF-8; questi finalmente ti consentono
di scrivere assieme in una medesima stringa parole latine, ebraiche,
arabe, cirilliche e persino cinesi e giapponesi.

Giusto per facilitarci la vita, Linux e Mac (e piu' o meno tutti
gli Unix) scelgono UTF-8; Windows invece sceglie Unicode.
ma Windows fatica persino a recepire Unicode, e per lungo tempo
preferisce continuare a basarsi su tanti charset nazionali
distinti: Latin-1, Latin-2, Arabic, Cyrillic etc
System non e' affatto un charset: significa semplicemente
"quello normale della piattaforma"; ergo Latin-1 sulle istallazioni
italiane, Cyrillic in quelle russe etc
e nota bene: i charsets di Windows non sono affatto i "code pages"
di ms-dos anche se spesso il nome e' identico; tecnicamente sono
diversi (ed ovviamente incompatibili).

veniamo ora finalmente al problema shapefile/spatialite.
sqlite internamente memorizza tutte le stringhe di testo in UTF-8,
quindi e' in grado di gestire qualsiasi lingua nota.
ma quando importi/esporti uno shapefile devi sempre specificare
esattamente quale charset deve essere utilizzato per convertire
i caratteri; se sbagli ottieni errori, ma piu' facilmente ancora
ottieni stringhe bizzarre ed illeggibili.


> Ora, avendo bisogno di mostrare le etichette dei nomi delle città in
> QGIS, a volte ho modificato a mano la colonna del nome interessato
> trasformando il cirillico in caratteri latini leggibili.
>

temo che la "chiave del mistero" si nasconda proprio qua; in
questo modo hai probabilmente creato un mostro, cioe' un DBF
in cui alcune strignhe sono codificate in Latin-1, mentre altre
sono invece codificate in Cyrillic.
visto che spatialite (e qualunque altro sw a me noto) partono
sempre dal presupposto che tutto il file per intero adotti solo
una singola codifica, ora qualunque filtro charset fallira':
se gli dici che e' Latin-1 verranno sbagliate tutte le scritte
in Cirillico; se gli dici che e' Cyrillic verranno sbaglate
tutte le scritte latine; non se ne esce :-D

nota bena: e' un papocchio tipico degli Shapefile su cui sono
state fatte modifiche "a mano"; per rimettere tutto a posto
esiste un unico modo: olio di gomito e correggere manualmente
e con santa pazienza tutte le inconsistenze una alla volta,
fino a che si riesce a riportare tutto il DBF in un singolo
charset.

auguri ed in bocca al lupo
Sandro


Maggiori informazioni sulla lista Gfoss