Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unicode: UTF-16 surrogate pairs? (https://www.delphipraxis.net/140073-unicode-utf-16-surrogate-pairs.html)

Deep-Sea 11. Sep 2009 09:27


Unicode: UTF-16 surrogate pairs?
 
Morgen allerseits ...

Bei meinen Experimenten mit Unicode habe ich festgestellt, dass Delphi mit UTF-16 surrogate pairs nicht umgehen kann. Stimmt das, oder bin ich wieder einmal nur zu doof? :gruebel:

Noch eine Kleinigkeit: U+0000 ist ya definiert - aber wie soll man so die BOM von UTF-16 eindeutig von UTF-32 unterscheiden, wenn ein UTF-16-Text mit zwei "Nullen" starten kann? :?

Danke ...

Bernhard Geyer 11. Sep 2009 09:31

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Deep-Sea
Bei meinen Experimenten mit Unicode habe ich festgestellt, dass Delphi mit UTF-16 surrogate pairs nicht umgehen kann. Stimmt das, oder bin ich wieder einmal nur zu doof? :gruebel:

Was hast du probiert?

Zitat:

Zitat von Deep-Sea
Noch eine Kleinigkeit: U+0000 ist ya definiert

<control> = NULL

Zitat:

Zitat von Deep-Sea
- aber wie soll man so die BOM von UTF-16 eindeutig von UTF-32 unterscheiden, wenn ein UTF-16-Text mit zwei "Nullen" starten kann? :?

Wieso nicht? Siehe Wikipedia

Deep-Sea 11. Sep 2009 09:39

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Bernhard Geyer
Was hast du probiert?

Einen String anzuzeigen, der ein surrogate pair enthielt. Resultat: Es werden zwei nicht darstellbare Zeichen angezeigt - wie man es erwartet, wenn surrogate pairs nicht unterstützt werden. Nur woran liegt das? Delphi? Windows? ...

Zitat:

Zitat von Bernhard Geyer
Wieso nicht? Siehe Wikipedia

Zitat:

Zitat von Wikipedia
UTF-16 Little Endian FF FE
UTF-32 Little Endian FF FE 00 00

Genau. Beide starten gleich und eine UTF-16 Datei darf ya Null-Zeichen enthalten, z.B.: FF FE 00 00 ... und nun? Dann sieht es aus was wäre es UTF-32 ...

Bernhard Geyer 11. Sep 2009 09:51

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Deep-Sea
Einen String anzuzeigen, der ein surrogate pair enthielt. Resultat: Es werden zwei nicht darstellbare Zeichen angezeigt - wie man es erwartet, wenn surrogate pairs nicht unterstützt werden. Nur woran liegt das? Delphi? Windows? ...

Welche Windows-Version? AFAIK wird UTF-16 erst ab XP bzw. W2K unterstützt.

Zitat:

Zitat von Deep-Sea
Zitat:

Zitat von Bernhard Geyer
Wieso nicht? Siehe Wikipedia

Zitat:

Zitat von Wikipedia
UTF-16 Little Endian FF FE
UTF-32 Little Endian FF FE 00 00

Genau. Beide starten gleich und eine UTF-16 Datei darf ya Null-Zeichen enthalten, z.B.: FF FE 00 00 ... und nun? Dann sieht es aus was wäre es UTF-32 ...

Nein. In einem UTF-16-String ist 0000 der Kennzeichner für String-Ende. (So wie 00 für einen Ansi-String der Ende-Kennzeichner ist). Und damit weist du nach den Bytes 3+4 das es eine UTF-32 Datei ist.
Schon mal Probiert einen String mit 0000 einer Wide-WinAPI zu übergeben? Der String wird dort abgeschnitten. Delphi kann mit String-Endekennzeichnern mitten im String umgehen. C/C++ jedoch nicht (und auch alle C-Kompatiblen Schnittstellen auch nicht).

Deep-Sea 11. Sep 2009 09:56

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Bernhard Geyer
Welche Windows-Version? AFAIK wird UTF-16 erst ab XP bzw. W2K unterstützt.

XP. Sind hier in der Firma voll up-to-date :mrgreen: ...
PS: Mein Firefox kann damit (sehr gut) umgehen. Aber den juckt Windows wahrscheinlich auch net sonderlich - sofern es an Windows liegt ...

Zitat:

Zitat von Deep-Sea
Schon mal Probiert einen String mit 0000 einer Wide-WinAPI zu übergeben? Der String wird dort abgeschnitten. Delphi kann mit String-Endekennzeichnern mitten im String umgehen. C/C++ jedoch nicht (und auch alle C-Kompatiblen Schnittstellen auch nicht).

Ya das weiß ich natürlich, aber es ist prinzipiell möglich U+0000 zu nutzen :P Na ok, war ya auch nur eine Randfrage ...

himitsu 11. Sep 2009 09:59

Re: Unicode: UTF-16 surrogate pairs?
 
Die #$0000 (alleinestehend) gehört doch garnicht zu den Surrogate Pairs (#$D800..#$DBFF, #$DC00..#$DFFF)

Im Normalfall wird die #0 als Ende-Markierung genutzt und demnach wäre es doch ein bissl schwachsinnig diese gleich als erstes Zeichen nach der BOM zu schreiben.
Und demnach kommt einfach in UTF16 kein FF FE 00 00 am Anfang vor. :angel2:


http://en.wikipedia.org/wiki/UTF-16/UCS-2
http://unicode.org/faq/utf_bom.html#utf16-2

Bernhard Geyer 11. Sep 2009 10:01

Re: Unicode: UTF-16 surrogate pairs?
 
Zeig mal deinen Quellcode zur Ausgabe des Surrogate Pairs.

Deep-Sea 11. Sep 2009 10:09

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von himitsu
Die #$0000 (alleinestehend) gehört doch garnicht zu den Surrogate Pairs (#$D800..#$DBFF, #$DC00..#$DFFF)

Waren ya auch zwei verschiedene Fragen von mir die nix miteinander zu tun haben :-D


Zitat:

Zitat von Bernhard Geyer
Zeig mal deinen Quellcode zur Ausgabe des Surrogate Pairs.

Hab keinen mehr, waren ya nur Tests. Wie wäre es mit
Delphi-Quellcode:
Canvas.TextOut(0, 0, #$D834 + #$DD1E); // Notenschlüssel
Aber mal 'ne andere Frage: Wer hat denn schon mal erfolgreich ein Zeichen das nicht im BMP steht mit Delphi ausgegeben?

Bernhard Geyer 11. Sep 2009 10:13

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Deep-Sea
Hab keinen mehr, waren ya nur Tests. Wie wäre es mit
Delphi-Quellcode:
Canvas.TextOut(0, 0, #$D834 + #$DD1E); // Notenschlüssel

Sag mal: Welche Delphi-Version verwendest Du? Links steht ja bei dir noch D2006

Deep-Sea 11. Sep 2009 10:15

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Bernhard Geyer
Sag mal: Welche Delphi-Version verwendest Du? Links steht ja bei dir noch D2006

Ups, wohl vergessen zu ändern *schnell noch mach* > D2009 Pro :-D

Deep-Sea 17. Sep 2009 07:59

Re: Unicode: UTF-16 surrogate pairs?
 
*push*

Es muss doch irgend jemanden geben, der wenigstens ja oder nein sagen kann ... das würde mir ya schon reichen :stupid:

Bernhard Geyer 17. Sep 2009 09:17

Re: Unicode: UTF-16 surrogate pairs?
 
Es geht (D2009 und Windows). Jedoch habe ich keine Font mit entsprechenden Zeichen so das ich nur ein 𝄞 angezeigt bekomme.
Mein Testcode:

Delphi-Quellcode:
var
  str: String;
  OrderText: String;
  i: Integer;
begin
  str := #$D834 + #$DD1E;

  OrderText := '';
  for i := 1 to Length(str) do
    OrderText := OrderText + ' #$' + IntToHex(Ord(str[i]), 4);

  Canvas.TextOut(100, 100, str);
  ShowMessage(Format('%s (%d), %s', [str, Length(str), OrderText]));
  Windows.MessageBox(self.Handle, PChar(str), 'Test', MB_OK);
end;

Deep-Sea 17. Sep 2009 10:37

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Bernhard Geyer
Es geht (D2009 und Windows). Jedoch habe ich keine Font mit entsprechenden Zeichen so das ich nur ein 𝄞 angezeigt bekomme.

Ein 𝄞? du meinst ein leeres Kästchen - denn ich sehe da einen Notenschlüssel (da ich einen passenden Font habe) :-D

Ich habe es eben nochmal getestet: Unter XP geht es nicht (zwei Platzhalter anstatt ein Notenschlüssel), aber unter Vista gehts! Juhu :mrgreen:
(Aber vlt. muss man/ich das bei XP nur irgendwie aktivieren oder so?)

Ydobon 17. Sep 2009 18:06

Re: Unicode: UTF-16 surrogate pairs?
 
Eigentlich sollte es XP von sich aus schaffen und hat es zumindest bei mir bisher auch immer, selbst bei absichtlicher Deaktivierung. Aber überprüf das einfach mal: Surrogates and Supplementary Characters

Deep-Sea 21. Sep 2009 11:39

Re: Unicode: UTF-16 surrogate pairs?
 
Zitat:

Zitat von Ydobon
Eigentlich sollte es XP von sich aus schaffen und hat es zumindest bei mir bisher auch immer, selbst bei absichtlicher Deaktivierung. Aber überprüf das einfach mal: Surrogates and Supplementary Characters

Ya, dass hatte ich vor dem Erstellen des Threads auch schon gelesen, aber nicht so ganz beachtet :roll: Nun habe ich's trotzdem nochmal getestet ... und siehe da, nach einem Neustart geht es auch bei meinem XP. Ich bin manchmal auch ein Idiot :-D

Danke an euch alle :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.

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