UTF8CharacterToUnicode

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

UTF8CharacterToUnicode

Beitrag von Heinrich Wolf »

Hallo,

ich wollte einen String aus einem TEdit in seine Hex Repräsentation auf einem TLabel (Lbl) wandeln lassen. Aber UTF8CharacterToUnicode liefert mir bei einem ä nur E4 und nicht den vollen Codepoint. Was mache ich falsch? Ich habe mich an http://wiki.lazarus.freepascal.org/LCL_ ... rToUnicode orientiert. Meine Compiler Version ist Lazarus 1.1 und fpc 2.7.1 .

Code: Alles auswählen

procedure TMainForm.EditChange(Sender: TObject);
  var     p : PChar;
          t,
          h : String;
          c : cardinal;
          l : Integer;
  begin
    p := pChar(Edit.Text);
    t := '';
    while p > '' do
      begin
        c := UTF8CharacterToUnicode(p, l);
        inc(p, l);
        h := IntToHex(c, 2);
        if odd(length(h)) then
          h := '0' + h;
        t := t + h + ' ';
      end;
    Lbl.Caption := Copy(t, 1, length(t) - 1);
  end;

Benutzeravatar
theo
Beiträge: 10891
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8CharacterToUnicode

Beitrag von theo »

Stimmt doch auch. Es ist E4 resp. 00E4

In Lazarus
Bearbeiten -> Aus Zeichentabelle einfügen -> Unicode Tab kannst du das anschauen.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: UTF8CharacterToUnicode

Beitrag von Heinrich Wolf »

Ich wollte den UTF8 Code. Folgender Code liefert mir das.

Code: Alles auswählen

procedure TMainForm.EditChange(Sender: TObject);
  var     p : PChar;
          t : String;
          l,
          i : Integer;
  begin
    p := pChar(Edit.Text);
    t := '';
    while p > '' do
      begin
        l := UTF8CharacterLength(p);
        for i := 1 to l do
          begin
            t := t + IntToHex(ord(p[0]), 2);
            inc(p);
          end;
        t := t + ' ';
      end;
    Lbl.Caption := Copy(t, 1, length(t) - 1);
  end;
Das liefert mir C3A4 für ein ä.

Benutzeravatar
theo
Beiträge: 10891
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8CharacterToUnicode

Beitrag von theo »

Ich glaube, du bist verwirrt.
Ich weiss jetzt auch nicht genau, wo's bei dir hakt, aber die Fkt. sind beide einwandfrei afaics.
Die eine gibt den Code Point in Unicode (UTF-16) zurück, die andere in UTF-8 Kodierung.
Beides afaics vom Resultat her richtig.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: UTF8CharacterToUnicode

Beitrag von Heinrich Wolf »

Ja. Unicode verwirrt mich tatsächlich. Ist Unicode immer UTF16? Oder ist Unicode ein Oberbegriff für UTF16, UTF8 und was es sonst noch so gibt? Ich wollte ein Abbild des UTF8 Strings aus dem Speicher haben. Wenn UTF8CharacterToUnicode UTF16 liefert, ist das natürlich nicht das, was ich wollte. Und ich finde, da passiert unheimlich viel unnötiges hin und her gerechne.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: UTF8CharacterToUnicode

Beitrag von mschnell »

http://de.wikipedia.org/wiki/Unicode

Lazarus (die Schnittstelle des User-Programms zur LCL) verwendet momentan UTF-8 (weil Linux das i.a. verwendet), Delphi verwendet (durchgängig, seit 2005 oder so) UTF-16 (bzw. UCS-2) (weil Windows das verwendet).

Ob Lazarus und FPC (u.a. wegen der Delphi-Kompatibilität, aber vielleicht auch weil die Missverständnisse besser verdeckt werden) auf 16-Bit Code umschwenken, wird in den Entwickler-Foren diskutiert.

MSDIDE (eine IDE und Bibliothek, die ebenfalls auf FPC basiert) verwendet ebenfalls 16 Bit Character-Code.

-Michael

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: UTF8CharacterToUnicode

Beitrag von Patito »

... [unkonstruktiven Unsinn gelöscht..]

Nur zum (eigenen) Verständnis:
UTF8CharacterToUnicode lieferte ein Cardinal, also den Codepoint in vollen 32-bit.

Mit Unicode = UTF-16 hat das hier also nichts zu tun.

Den Namen "UTF8CharacterToUnicode" finde ich sehr verwirrend.
Sowas wie UTF8CharacterToUTF32 wäre eventuell klarer.

Antworten