Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Unicode erkennen (https://www.delphipraxis.net/118165-unicode-erkennen.html)

Zacherl 1. Aug 2008 17:46


Unicode erkennen
 
Hey,

ich brauche eine Funktion, mit der ich erkennen kann, ob in einem String Unicode Zeichen vorhanden sind. Ich stelle in einer Komponente folgende Procedure bereit::

Delphi-Quellcode:
procedure DoSomething(Text: String)
Nun kann der Funktion sowohl ein "normaler" ASCII String übergeben werden, oder aber ein nach String getypecasteter Unicode String der Form:

Delphi-Quellcode:
String(MyWideString)
Jetzt muss ich allerdings innerhalb der Funktion wissen, ob es sich um Unicode handelt oder nicht. Überladen der Funktion bzw Hinzufügen eines weiteren Parameters scheidet aus bestimmten Gründen aus.

Hoffe da kann mir jemand helfen. :)

Gruß Zacherl

mkinzler 1. Aug 2008 17:53

Re: Unicode erkennen
 
Dürfte egal sein, da der Inhalt des Parameters kein Unicode mehr enthält.

Zacherl 1. Aug 2008 17:56

Re: Unicode erkennen
 
Natürlich. Ein Unicode Zeichen besteht aus 2 Bytes. Ein ASCII Zeichen nur aus Einem. Innerhalb der Funktion sieht es dann so aus:

Delphi-Quellcode:
{ ASCII }
  Text = (#13)

{ UNICODE }
  Text = (#00 #13)
Bei der ersten Variante wurde VK_RETURN in einem String übergeben und bei der zweiten Variante in einem WideString. Unicode Zeichen benutzen halt zusätzlich noch das erste Byte. Bei normalen ASCII Zeichen wird das erste Byte einfach nicht verwendet.

Gausi 1. Aug 2008 17:58

Re: Unicode erkennen
 
Aber durch den Typcast geht genau das verloren.

BUG 1. Aug 2008 18:02

Re: Unicode erkennen
 
Wenn fast jedes 2te (Little-Endian) Byte eine Null ist oder oder eine Surrogate-Bitfolge (siehe UTF-16) enthält, ist es mit großer Wahrscheinlichkeit, ein WideString ist, vorausgesetzt du verwendest lateinisch Buchstaben.

//Edit1: (= praktischer Vorschlag)

Du nimmst erstmal den AnsiString an und wenn zu viele ungültige/unübliche Zeichen enthalten sind, probierst du es eben mit als Widestring.

//Edit2:

Wenn mkinzler recht hat (und das ist bei Delphi wahrscheinlich), geht das von mir natürlich vorgeschlagene nicht.

MfG,
Bug

himitsu 1. Aug 2008 19:07

Re: Unicode erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
String(MyWideString) macht keinen schnöden TypeCast ... es lebe die Compilermagic :stupid:

der WideString wird in einen (Ansi)String umgewandelt ... ergo, es gibt keine Unicodeinformationen mehr.


Lösung: versuch's mal mit PChar/PAnsiChar und PWideChar

oder wie wär's mit UTF8?
Delphi-Quellcode:
DoSomething(MyAnsiString);
DoSomething(UTF8Encode(MyWideString));

procedure DoSomething(Text: String);
var S: WideString;
begin
  S := UTF8Decode(Text);
  if (Text <> '') and (S <> '') then begin
    // WideString in S
  end else begin
    // AnsiString in Text
  end;
end;
[edit] falschen Dateiangang ersetzt :wall:

BUG 1. Aug 2008 19:22

Re: Unicode erkennen
 
OffTopic@himitsu Wieso hast du einen "Handygutschein" angehangen? Und dann auch noch als BMP :roll:

MfG,
Bug

Luckie 1. Aug 2008 20:32

Re: Unicode erkennen
 
Man kann nicht hundertprozentig zwischen Unicode und ANSI unterscheiden. Siehe dazu Raymond Chen:
http://blogs.msdn.com/oldnewthing/ar.../24/95235.aspx
und
http://blogs.msdn.com/oldnewthing/ar...7/2158334.aspx

Gausi 1. Aug 2008 21:05

Re: Unicode erkennen
 
@Luckie: Ist das die GEschichte, dass man kein "Blödsinn" mit Notpad schreiben kann? Zumindest unter XP, bei Vista geht das mitlerweile. Aber darum eghts hier glaube ich gar nicht. Wenn eine Prozedur einen String-Parameter erwartet, und man da einen Widestring reinpackt, dann wird der 2-Byte-Zeichensatz auf den 1-Byte-Zeichensatz gemappt. Das geht bei normalen Texten ganz gut, aber alles was nicht in ein Byte reinpasst, wird zu "?". In der Prozedur kommt dann nichts mehr mit Unicode an.

Ist vielleicht vergleichbar mit einer Prozedur, die einen Byte-Parameter erwartet und der man einen Integer übergibt. Solange der Integer kleiner als 256 ist, ist alles ok, danach geht Information verloren.

Luckie 1. Aug 2008 21:16

Re: Unicode erkennen
 
Zitat:

Zitat von Zacherl
ich brauche eine Funktion, mit der ich erkennen kann, ob in einem String Unicode Zeichen vorhanden sind.

Er muss also Unicode erkennen, um dann entscheiden zu können, welche Funktion er aufrufen muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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