Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Unicode String nach Hex mit angabe der Codepage (https://www.delphipraxis.net/161343-unicode-string-nach-hex-mit-angabe-der-codepage.html)

jarib 29. Jun 2011 15:35

Delphi-Version: XE

Unicode String nach Hex mit angabe der Codepage
 
Hallo zusammen,

für das folgendes Problem benötige ich einen kleinen Denkanstoß!

Ich möchte einen Unicode/Utf8 String welchen ich aus einer XML Datei lese in
die entsprechende Unicode Zeichennummer (hexadezimal) wandeln unter Berücksichtigung einer beliebigen Codepage.

Folgendes habe ich bereits ausprobiert aber aus einem mir unbekannten Grund kommt trotz
Wechsel der Codepage immer das gleiche Ergebnis bei mir heraus.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  stTmp   : String;
  bbytes  : TBytes;
begin
  stTmp:= 'Zeile';
  bbytes:= TEncoding.GetEncoding(1251).GetBytes(stTmp);
end;
Ergebnis: $5A, $65, $69, $6C, $65 (90, 108, 105, 108, 101)
Ich erwarte allerdings für die Codepage 1251 (Kyrillisch): $043B, $0438, $043D, $0438, $044F

Hintergrund der ganzen Geschichte ist, dass ich die Ressourcen Datei *_DRC.rc vom Delphi Translation Manager
nachbauen möchte. Unter dem Delphi XE werden nämlich die Übersetzungen der Sprachen (ungleich Latin) in der
Stringtable der RC Datei mit der Unicode Zeichenummer in Hex hinterlegt.

Bin dankbar für jeden Hinweis!

Gruß

himitsu 29. Jun 2011 15:48

AW: Unicode String nach Hex mit angabe der Codepage
 
Unicode/UTF-16 hat keine Codepage ... OK, eigentlich stimmt das nicht, da dieses virtuelle Codepage 1200 bekommen hat.
UTF8 hat zwar auch eine Codepage, aber ich weiß jetzt dennoch nicht wo du die Codepage haben willst?

> UTF-8 nach Unicode und dann nach Hex? (keine Codepage nötig)

> UTF-8 nach Unicode, dann nach ANSI mit einer Codepage und zum Schluß nach HEX?

PS: 'Zeile' sieht in jeder Codepage gleich aus, da die unteren 128 Zeichen überall gleich sind.
Aber vom Prinzip her, dürfte dein Code schon korrekt sein.

p80286 29. Jun 2011 16:09

AW: Unicode String nach Hex mit angabe der Codepage
 
Naja "codepage" wird ja oft genug falsch verwendet.
Hier die bekannten Unicode "Codepages"

Gruß
K-H

himitsu 29. Jun 2011 16:29

AW: Unicode String nach Hex mit angabe der Codepage
 
Das sind aber keine Codepages?
Sind doch nur die Codeblöcke, so wie man die Zeichen im Unicode verteilt hat.

ANSI, UTF-8, UTF-7, UTF-16 usw. sind quasi "nur" Komprimierungsverfahren, welche den großen Zeichenvorat des UCS beschränken und/oder komprimieren.
Und die Codepage gibt z.B. im ANSI den Zeichenvorat an, welcher dort reincodiert wurde/werden kann.

Uwe Raabe 29. Jun 2011 17:19

AW: Unicode String nach Hex mit angabe der Codepage
 
Zitat:

Zitat von jarib (Beitrag 1108936)
Ich erwarte allerdings für die Codepage 1251 (Kyrillisch): $043B, $0438, $043D, $0438, $044F

Da TBytes als array of Byte (8 Bit) deklariert ist, können da unmöglich Werte wie $043B (16 Bit) drinstehen.

Wenn ich aber mal einen string definiere als

Delphi-Quellcode:
const
  sTest: string = #$043B#$0438#$043D#$0438#$044F;
und mir diesen String anzeigen lasse, dann kommen da kyrillische Buchstaben raus, die laut Google Translate sowas wie "Linie" bedeuten.

Du glaubst aber nicht, daß TEncoding eine Übersetzung des Strings liefert?

himitsu 29. Jun 2011 17:38

AW: Unicode String nach Hex mit angabe der Codepage
 
Jupp, eine Ansi-Codepage 1251 wird immer nur ein Byte pro Zeichen haben, außer bei einigen Multibyte-Codepages.

Aber auch Unicode kann man in einem ByteArray ablegen ... immer 2 Byte pro Zeichen.
PS:
Delphi-Quellcode:
Ord(MyString[Zeichenindex])
, bei einem Unicodestring würde auch noch gehen.

Uwe Raabe 29. Jun 2011 17:42

AW: Unicode String nach Hex mit angabe der Codepage
 
Zitat:

Zitat von himitsu (Beitrag 1109002)
Jupp, eine Ansi-Codepage 1251 wird immer nur ein Byte pro Zeichen haben, außer bei einigen Multibyte-Codepages.

Aber auch Unicode kann man in einem ByteArray ablegen ... immer 2 Byte pro Zeichen.
PS:
Delphi-Quellcode:
Ord(MyString[Zeichenindex])
, bei einem Unicodestring würde auch noch gehen.

Wie gesagt: die Hex-Sequenz, die er erwartet, entspricht der kyrillischen Übersetzung von "Zeile"...

p80286 29. Jun 2011 17:50

AW: Unicode String nach Hex mit angabe der Codepage
 
Zitat:

Zitat von himitsu (Beitrag 1108968)
Und die Codepage gibt z.B. im ANSI den Zeichenvorat an, welcher dort reincodiert wurde/werden kann.

Nachdem HP und Microsoft mir leicht unterschiedliche Definitionen von Codepage untergejubelt haben, interpretiere ich "codepage" als die Zeichensammlung, die von 8Bit-Werten erzeugt werden kann.
Und wenn ich für die Interpretation "killefit" benötige, dann benutz' ich es auch.

Und wenn ich UTF-8 richtig interpretiere, dann ist UTF-8 ein 8Bit Zeichensatz, bei dem bestimmte "Escape-Werte" es ermöglichen mehr als die "üblichen 256 Zeichen" darzustellen.

Gruß
K-H

jarib 29. Jun 2011 19:43

AW: Unicode String nach Hex mit angabe der Codepage
 
Danke erstmal für die Antworten!

Meinen Beispiel String (Zeile) möchte ich unter einer X beliebigen Sprache
ausgeben. Dazu benötige ich doch die Angabe einer Codepage, damit meine
ich die Angabe einer sprachspezifischen Zeichentabelle.

Die Konvertierung von Utf-8 -> Unicode -> Hex unter der gleichen Sprache ist
Problemlos möglich. Das sehe ich auch so!

Aber sobald ich von Latin auf Kyrillisch oder Chinesisch oder sonst eine Sprache
wechsel benötige ich doch die Angabe einer Codepage oder meinetwegen auch Zeichentabelle.

Die Codepage unter der z.B. Deutsch zu finden ist, sollte die 1252 sein und
für Kyrillisch die 1251. (Nach Microsoft wie p80286 dies bereits erwähnt hat)

Die Codepage 1200 ist mir ehrlich gesagt unbekannt.

Zurück zu meiner Frage ...

Wenn ich mir meinen Codesnipsel noch mal genauer anschaue, hat Raabe wohl recht
das in eine TByte keine 16 Bit rein passen. Hm ...

Mein Ansatz muss falsch sein. Ich bin davon ausgegangen das der Translation Manager das deutsche Wort als Ausgang benutzt um die Hex Sequenz für die Übersetzung zu erzeugen.
Das kann ja nicht funktionieren!

Ich gehe eher mal davon aus das der Translation Manager die Übersetzung benutzt
um daraus die Hex Sequenz zu erzeugen.

Allerdings frage ich mich wie bekomme ich über
TEncoding ... GetBytes einen 16 Bit großen Rückgabewert. Welcher für Kyrillisch
Codepage verwendet wird.

Uwe Raabe 29. Jun 2011 20:13

AW: Unicode String nach Hex mit angabe der Codepage
 
Ich verstehe immer noch nicht, warum du bei einem Unicode-Programm mit den Code-Pages rumhantieren willst. Wenn du die russische Übersetzung für "Zeile" brauchst, dann schreib doch einfach "линия". Dabei ist das vollkommen egal, ob das kyrillische Wort in einer XML-Datei mit UTF8-Codierung steht. Jede brauchbare XML-Umsetzung gibt dir den String in Unicode zurück bzw. läßt dich ihn als Unicode schreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz