AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Unicodezeichen mit mehr als einem wideChar?

Ein Thema von Mavarik · begonnen am 18. Mai 2021 · letzter Beitrag vom 19. Mai 2021
Antwort Antwort
Der schöne Günther

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

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.157 Beiträge
 
Delphi 10.3 Rio
 
#2

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.201 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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.157 Beiträge
 
Delphi 10.3 Rio
 
#4

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

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:04 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