![]() |
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:
Nun kann der Funktion sowohl ein "normaler" ASCII String übergeben werden, oder aber ein nach String getypecasteter Unicode String der Form:
procedure DoSomething(Text: String)
Delphi-Quellcode:
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.
String(MyWideString)
Hoffe da kann mir jemand helfen. :) Gruß Zacherl |
Re: Unicode erkennen
Dürfte egal sein, da der Inhalt des Parameters kein Unicode mehr enthält.
|
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:
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.
{ ASCII }
Text = (#13) { UNICODE } Text = (#00 #13) |
Re: Unicode erkennen
Aber durch den Typcast geht genau das verloren.
|
Re: Unicode erkennen
Wenn fast jedes 2te (Little-Endian) Byte eine Null ist oder oder eine Surrogate-Bitfolge (siehe
![]() //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 |
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:
[edit] falschen Dateiangang ersetzt :wall:
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; |
Re: Unicode erkennen
OffTopic@himitsu Wieso hast du einen "Handygutschein" angehangen? Und dann auch noch als BMP :roll:
MfG, Bug |
Re: Unicode erkennen
Man kann nicht hundertprozentig zwischen Unicode und ANSI unterscheiden. Siehe dazu Raymond Chen:
![]() und ![]() |
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. |
Re: Unicode erkennen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 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