+ UNICODE : Zeichen (z.B. Euro) konvertieren : ANSI-->unicode
MichaelR
- programmiertechnik
0 Sönke Tesch0 MichaelR
Hallo,
mein selbstgeschriebenes Programm (Delphi) verwendet ausschließlich den Zeichensatz von ANSI/ASCII zur Dateneingabe.
In einer Funktion wandle ich den jeweiligen Buchstaben in den entsprechenden Unicode-Wert um:
Vorgehen:
Im umzuwandelnden String steht ein beliebiges Wort (z. B. "Haus"); jetzt wird jeder einzelne Buchstabe in den Unicode-Zeichenwert umgewandelt:
Haus ==> \u0048\u0061\u0075\u0073
1. vom Buchstaben den ASCII/ANSI Werte ausgeben lassen (z. B. beim Eurozeichen 128)
2. diesen ANSI/ASCII WErt in einen Hex-Wert konvertieren (z. B. beim Eurozeichen \u0080)
Das geht alles einwandfrei. Nur falls das Euro-Zeichen umgewandelt werden soll (es steht meines Wissens nach auf ANSI/ASCII 128 kommt als Wert \u0080 - und dieser Wert ist allerdings im Unicode-System ein Leerzeichen (zumindest kein Euro-Zeichen). Die Umwandlung von dez in hex Wert wäre an für sich ja ok, aber das Endergebnis stimmt leider nicht mehr...
Jetzt die Fragen:
1. Es scheint Zeichen zu geben, die im ASCII/ANSI Zeichensatz auf einem bestimmten dezimalen Wert zu finden sind, wird dieser aber in einen Hex-Wert umgewandelt stimmt das nicht mehr mit dem UNICODE-System überein.
Wie finde ich heraus welche Zeichen (außer dem Euro) noch betroffen sind, ohne alle ANSI/ASCII Werte manuell durchzuprobieren?
2. Was könnte ich machen, damit beim Konvertieren von dezimal in hex das Problem ausgeschlossen wird ? Ich also beim Eurozeichen hex 20AC bekomme, statt 0080...
Vielleicht kennt jemand auch eine Webseite wo ich mehr darüber nachlesen kann. Unicode.org kenne ich bereits :-)
Danke schonmal.
michael
- vom Buchstaben den ASCII/ANSI Werte ausgeben lassen (z. B. beim Eurozeichen 128)
Das Eurozeichen steht im ASCII-Zeichensatz nicht auf 128, es existiert dort nicht einmal. Der ASCII-Zeichensatz enthält nur 128 Zeichen, von 0 bis 127.
Das, was Du da vor Dir hast, ist die Microsoft Codepage 1252. Es gibt _einen_ weiteren 8-Bit-Zeichensatz, der das Eurozeichen enthält, und zwar iso-8859-15 ("latin 9"), dort steht es auf Position 164, da die Zeichen um 128 für Steuerzeichen reserviert sind. iso-8859-15 ist ein Abkömmling von iso-8859-1 und bis auf das Eurozeichen und zwei oder drei weitere identisch.
Weiterhin sind fast alle weiter verbreiteten Zeichensätze in den ersten Positionen bis einschließlich 127 identisch mit ASCII.
Um der Vollständigkeit halber das Chaos perfekt zu machen, haben einige Schlaumeier iso-8859-1 genommen (von Haus aus kein Eurozeichen) und dort auf 128 das Eurozeichen eingefügt. Steht zwar in keinem Standard, hilft aber dafür über Probleme mit Leuten hinweg, die auf Windows schreiben, eigentlich CP1252 benutzen, ihre Sachen aber als iso-8859-1 ausgeben.
- Es scheint Zeichen zu geben, die im ASCII/ANSI Zeichensatz auf einem bestimmten dezimalen Wert zu finden sind, wird dieser aber in einen Hex-Wert umgewandelt stimmt das nicht mehr mit dem UNICODE-System überein.
Wie gesagt, Du hast kein ASCII und kein ANSI vor Dir, Du hast Microsoft CP 1252.
Wie finde ich heraus welche Zeichen (außer dem Euro) noch betroffen sind, ohne alle ANSI/ASCII Werte manuell durchzuprobieren?
Dafür gibt es keinen Automatismus, schau Dir einfach die Codetabellen an. Die Unicode-Tabellen findest Du unter http://www.unicode.org/charts/, ASCII-Tabelle und ihre ISO-Erweiterungen unter http://selfhtml.teamone.de/inter/zeichensaetze.htm, Microsofts CP1252 unter http://www.microsoft.com/globaldev/reference/sbcs/1252.htm.
Unicode Basic Latin 1 entspricht dabei (wie oben gesagt) ASCII, Latin 1 Supplement iso-8859-1.
- Was könnte ich machen, damit beim Konvertieren von dezimal in hex das Problem ausgeschlossen wird ? Ich also beim Eurozeichen hex 20AC bekomme, statt 0080...
Du brauchst eine Konvertierungstabelle CP1252 -> Unicode. Da Windows Unicode zumindest halbwegs vernünftig "spricht", gibt es möglicherweise sogar eine eingebaute Funktion dafür. Andernfalls hilft Dir vielleicht http://oss.software.ibm.com/icu/charset/ weiter.
Du solltest auch beachten, daß es verschiedene Arten gibt, Unicode-Zeichen zu speichern. Im Moment benutzt Du die 16-Bit-Variante, alle Unicode-Zeichen bekommst Du aber nur mit der 32-bittigen. Gut, Du hast nur 256 Zeichen umzusetzen, trotzdem solltest Du darauf achten, Deine Daten richtig und kompatibel zu speichern. Informiere Dich über utf-8, utf-16 und Co.
Gruß,
soenk.e
Hallo Sönke,
danke für Deine Antwort, vor Allem für die beiden letzten Links.
Gruß
Michael