2 Stimmen

Konvertierung von UTF-8 PostgreSQL DB in WIN-1255 Shapefile

Ich habe eine PostgreSQL \PostGIS räumliche Datenbank, die hebräische Textspalten enthält. Das System läuft auf Ubuntu, und alles funktioniert einwandfrei mit UTF-8.

Ich versuche, einige Tabellen in ein Shapefile für ein Windows-Programm zu übertragen, das nur Windows-1255-Strings lesen kann. Leider, pgsql2shp hat keine Kodierungsoption, obwohl shp2pgsql hat, so dass das Widnows-Programm UTF-8 geparst als Windows-1255 liest, was Kauderwelsch ergibt.

Ich habe versucht, eine Windows-1255-Ansicht für die Tabellenspalten zu erstellen, aber keine Möglichkeit gefunden, dies zu tun, ohne die Datenbank zu beschädigen.

Haben Sie eine Idee, wie man die Tabellen konvertieren kann?

Gracias,

Adam

UPDATE:

Ich dachte, dieses Problem sei gelöst (siehe meine eigene Antwort), aber ich bekomme immer noch zufällige Fehler wie:

ERROR:  character 0x9f of encoding "WIN1255" has no equivalent in "UTF8"

Was ich möchte, ist eine Art Auslassungsfunktion: wie iconv 's -c Flag, das einfach keine Quellzeichen kopiert, die keine entsprechende int-Zielkodierung haben.

1voto

bobince Punkte 512550

Wenn Sie wirklich ASCII meinen, können Sie unmöglich hebräische Zeichen retten. ASCII ist nur der 7-Bit-Zeichensatz bis zu \x7F .

Welche Art von Zeichenketten liest dieses Windows-Programm also? Wenn es ASCII oder Latin-1 ist, werden Sie nie Hebräisch bekommen. Wahrscheinlicher ist, dass es sich um "die aktuelle System-Codepage" handelt, die unter Windows auch (irreführenderweise, aber allgemein) als "ANSI" bekannt ist.

In diesem Fall müssen Sie die System-Codepage auf jedem Rechner, auf dem das Windows-Programm läuft, auf Hebräisch einstellen (Codepage 1255). Ich glaube, dass shp-Dateien keinerlei Informationen über die Zeichenkodierung enthalten, so dass die Shapefiles nur auf Rechnern mit dieser Codepage korrekt funktionieren (die Standardeinstellung ist nur für das israelische Gebietsschema). (Anscheinend .dbf Ausfuhren können eine begleitende .cpg Datei, um die Kodierung festzulegen, aber ich weiß nicht, ob das Programm, das Sie verwenden, das unterstützt).

Dann müssten Sie die Daten als Codepage 1255 exportieren, oder als das, was in Postgres am ehesten möglich ist, nämlich ISO-8859-8. Da das Export-Skript keine Möglichkeit zu haben scheint, etwas anderes zu tun, als direkte Bytes aus der Datenbank zu nehmen, müssten Sie eine Datenbank in der ISO-8859-8-Kodierung erstellen und alle Daten aus der UTF-8-Datenbank in die 8859-8-Datenbank übertragen, entweder direkt durch Abfragen oder, was vielleicht einfacher ist, mit pgdumpall und laden Sie die SQL-Datei in Notepad und speichern Sie sie erneut als Hebräisch anstelle von UTF-8 (passen Sie dabei alle in der SQL-DDL aufgeführten Codierungseinstellungen an).

Ich frage mich, ob die Macher des Windows-Programms dazu überredet werden konnten, UTF-8 zu unterstützen? Es ist ein bisschen traurig, dass man in diesem Jahrhundert mit Codepage-spezifischer Software feststeckt.

0voto

Adam Matan Punkte 116541

Innerhalb des Bash-Skripts:

select ENCODING in UTF8 WIN1252 WIN1255 ISO-8859-8;
do
        if [[ -n $ENCODING ]]; then
                export PGCLIENTENCODING=$ENCODING;
                break
        else
                echo 'Invalid encoding.'
        fi
done

El export PGCLIENTENCODING=$ENCODING; Anweisung erfüllt den Zweck.

0voto

gimel Punkte 78080

Überprüfung der hebräischen Kodierungstabellen und Seitentabellen, können Sie sehen, dass ISO-8859-8 y Fenster-1255 haben kein Mapping für 0x9f .

Die Daten, die Sie zu konvertieren versuchen, könnten auf den älteren Codepage 862 , eine Codepage für Hebräisch unter DOS. Codepage 862 bildet den Code ab 0x9f auf das Unicode-Zeichen "LATEINISCHER KLEINBUCHSTABE F MIT HAKEN", 0x0192 .

Sie können ähnliche "zufällige" Fehler untersuchen und eine Zuordnung für die Nicht-Windows-1255-Codes in den Daten vornehmen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X