AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicodezeichen mit mehr als einem wideChar?

Ein Thema von Mavarik · begonnen am 18. Mai 2021 · letzter Beitrag vom 19. Mai 2021
Antwort Antwort
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.251 Beiträge
 
Delphi 12 Athens
 
#1

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 07:25
Der Code wird in Delphi mit Unicode-Unterstützung funktionieren, wie erwartet. Auch die Datenbank hat in der Regel ein Kodierschema, ist das Feld dort auch Unicode, hast du kein Problem. Wenn du versuchst, UniCode-Strings in non-Unicode-Felder zu schrieben, wird bei Sonderzeichen eher was unerwartetes passieren.
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 08:47
Ab Version 2000 verwendet Windows intern UTF-16 und nicht mehr UCS-2. Programme die darauf laufen sollten eigentlich bei normalen Zugriffen keine Probleme haben, egal ob ein Zeichen mit 2 oder mit 4 Byte kodiert ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 09:07
Hier geht es nicht um UCS2/UTF-16, bzw. nich um die Codierung der "Chars" im Unicode, aber ja die Surrogates bestehen ebenfalls aus 2 Chars. (die lassen sich aber auch supereinfach prüfen/finden)

Die CombiningChars/Composites gab es auch früher schon und das auch in jeder anderen Codierung ala ANSI, UTF-8 usw., also wo, unabhängig von der Kodierung, mehrere Char virtuell ein "Zeichen" darstellen.
z.B. A¨ = Ä oder E´ = É (wobei man letzteres auch selbst eingeben kann, aber da andersrum, also zuerst ´ und dann E)

Wobei es diese Combining-Chars doppelt gibt. Einmal Einzeln und einmal als Combinierend.
Und bei den Smilies erfandman das nun auch, um gendern und rassieren zu können, für weiblich/männlich und viele Hautfarben.

https://en.wikipedia.org/wiki/Precomposed_character
https://de.wikipedia.org/wiki/Kombinierendes_Zeichen

´ Acute Accent #$B4
◌́ Combining Acute Accent #$0301 (p.s siehe Zitat, denn es ist ein ◌ + ´)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Mai 2021 um 09:28 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 09:15
Es doch eigentlich genau was himitsu sagt - Es geht nicht um Bytes. Es geht um Zeichen. Und wie diese Zeichen auf dem Bildschirm (für einen Menschen) dargestellt werden ist nicht das gleiche.

Dieser nicht ganz erst gemeinte Comic zeigt das auch nochmal gut:
https://xkcd.com/1813/

Ich sehe das große Problem noch nicht ganz. Wenn jemand als Vorname "Jupp 😎" eingibt und aus diesem Eingabefeld maximal die ersten sechs Zeichen gespeichert werden muss er doch damit leben können wenn ein Programm dann später "Jupp �" anzeigt. Alternativ filtert man das halt einfach raus, sollte man mit Benutzereingaben eh immer machen:

Delphi-Quellcode:
uses System.Character;

var
   newText: String;
   finalText: String;
   character: Char;
begin
   newText := String.Empty;
   for character in 'Hallo 😎'.Substring(0, 7) do
      if(character.IsLetterOrDigit()) then
         newText := newText + character;

   Edit1.Text := newText;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.164 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 09:40
Nicht so ganz...

Anbei mal ein kleines TestProg.

Beispiel: Memo Zeile 687 & 688
Wenn ich einen String vergleich mache und suche das Zeichen aus Zeile 687, finde ich auch das Zeichen aus 688 das aber eigentlich ein anderes Zeichen ist,
ich müsste also bei diesem Char nach der Suche immer das nächste Zeichen prüfen und dann vergleichen, ob diese Kombination ein neues Zeichen ergibt.

Das gleich bei einer Abgeschnittenen Ausgabe...

oder Memo Zeile 292...
Ich finde in einem String ein "r" bei 290 und 291 muss ich das nächste Zeichen kontrollieren bei 292 die nächsten 2.

Die Tabelle ist eine Unicode Teilmenge der Latin 1.2 Erweiterung. (Nur die Zeichen, die in ein Ascii Zeichen umgewandelt werden können)
Wenn ich also einen beliebigen Unicode String der in eine TEdit per Clipboard kopiert wird auf Validität überprüfen will, ist das nicht so ganz einfach.

Ich hoffe immer noch, dass ich etwas übersehe...

Mavarik
Angehängte Dateien
Dateityp: zip CharTest.zip (3,3 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 10:17
Das konkrete Problem habe ich noch nicht verstanden. Angenommen du hast den String "Dånsk". Also "D" + (char)0x61 + (char)0x30A + "nsk" Dann liefert "Dånsk".StartsWith("Da") auch false , obwohl die ersten beiden Character ja übereinstimmen.

Ist doch alles gut so? Wenn du von Hand nun Strings in der Mitte durchsäbelst speicherst du in deiner Anwendung im schlimmsten Fall nur "Da" statt "Då".
Das gilt, solange wir über "Combining Marks" und nicht über die ganz crazy Sachen wie 👸🏿 sprechen.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.164 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Unicodezeichen mit mehr als einem wideChar?

  Alt 19. Mai 2021, 11:54
Das konkrete Problem habe ich noch nicht verstanden. Angenommen du hast den String "Dånsk". Also "D" + (char)0x61 + (char)0x30A + "nsk" Dann liefert "Dånsk".StartsWith("Da") auch false , obwohl die ersten beiden Character ja übereinstimmen.
OK, StartWith kann das also, gut zu wissen - oder auch nicht. Kommt darauf an, welche Funktionalität man erwartet.

Eine Routine die Feststellen muss, ob es sich um Kosit, Latin 1.1 oder Latin 1.2 handelt sieht dann so aus...

Delphi-Quellcode:
For i:=1 to length(S) do
  begin
    if Dic3Char.TryGetValue(S[i],Target) then
      begin
        if length(S) > I+2 then
          begin
            if (s[i+1] = Target.Char2) and (S[i+2] = Target.Char3) then
              Exit(IsLatin1_2);
          end;
      end else begin
    if Dic2Char.TryGetValue(S[i],Target) then
      begin
        if length(S) > I+1 then
          begin
            if (s[i+1] = Target.Char2) then
              begin
                if IsLatin1_1(S[i],s[i+1]
                  then Exit(IsLatin1_1)
                  else Exit(IsLatin1_2);
              end;
          end;
      end else begin
        if not Dic1Char.TryGetValue[S[i],Target) then
        Exit(NonKoSIT);
      end;
    end;
  end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 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