2010-02-17 11 views
7

Ich muss ein Programm schreiben, das Strings verschiedener Länge durchsucht und nur diejenigen auswählt, die mit Symbolen aus dem von mir definierten Satz geschrieben sind (insbesondere japanische Buchstaben). Strings enthalten Wörter in verschiedenen Sprachen (Deutsch, Französisch, Arabisch, Russisch, Englisch usw.). Offensichtlich gibt es eine große Anzahl von möglichen Zeichen. Ich weiß nicht, welche Struktur dafür zu verwenden ist? Ich verwende gerade Delphi 7. Kann jemand vorschlagen, wie man solches Programm schreibt?Mit Unicode-Zeichenfolgen in Delphi 7 arbeiten

Antwort

12

Offensichtlich wären Sie mit Delphi 2010 besser dran, da die VCL in Delphi 7 keine Unicode-Strings kennt. Sie können WideString-Typen und WideChar-Typen in Delphi 7 verwenden und Sie können einen Komponentensatz wie die TNT-Unicode-Komponenten installieren, um Ihnen beim Erstellen einer Benutzeroberfläche zu helfen, die Ihre Ergebnisse anzeigen kann.

Verwenden Sie für einen sehr großen Typ ein Bit-Array wie TBits. Ein Bit-Array der Länge 65536 würde ausreichen, um jeden UTF-16-Codepunkt zu enthalten. Prüfen, ob Char X in Y definieren, wäre im Grunde:

function WideCharsInSet(wcstr:WideString; wcset:TBits):Boolean; 
var 
n:Integer; 
wc:WideChar; 
begin 
result := false; 
for n := 1 to Length(wcstr) do begin 
    wc := wcstr[n]; 
    if wcset[Ord(wc)] then 
     result := true; 
end; 
end; 

procedure Demo; 
var 
wcset1:TBits; 
s:WideString; 
begin 
wcset1 := TBits.Create; 
try 
    // 1157 - Hangul Korean codepoint I found with Char Map 
    wcset1[1157] := true;   
    // go get a string value s: 
    s := WideChar(1157); 
// return true if at least one element in set wcset is found in string s: 
    if WideCharsInSet(s,wcset1) then begin 
     Application.MessageBox('Found it','found it',MB_OK); 
    end; 

finally 
    wcset1.Free; 
end; 

end; 
+0

+1 alle guten Bits in der Antwort. bigsets, TNT und empfehlen, dies in D7 überhaupt nicht zu tun. –

+0

Ich habe hier einen nützlichen Code für Sie geschrieben, Tofig –

+0

Eine großartige Funktion in Delphi 2010 TStringList-Klasse ist die Möglichkeit, eine Datei von der Festplatte zu laden, automatisch UTF8 oder UTF16-Codierung von den Byte-Markierungen zu bestimmen, und so weiter. Das ist ein weiterer Teil Ihrer Aufgabe, Tofig, der in der Version von Delphi, die älter als 2009/2010 ist, schwieriger werden wird. –

5

ich nach Delphi 2010 wechseln auch empfehlen (warum mit 2009 Mühe mehr?)!

Wenn im unwahrscheinlichen Fall, dass Sie mit Delphi 7 stecken bleiben, kann die Unicode Library von Mike Lischke etwas hilfreich sein.

+0

Link ist jetzt kaputt – CyprUS

+0

@CyprUS, behoben! –

5

Für die einfache Verarbeitung von Zeichenfolgen in der Art und Weise, die Sie beschreiben, lassen Sie sich nicht von Vorschlägen abschrecken, dass Sie auf den neuesten Compiler und das Unicode-aktivierte Framework aktualisieren sollten. Die Unicode-Unterstützung selbst wird natürlich durch die zugrunde liegende Windows-API bereitgestellt, die natürlich (direkt) von "Nicht-Unicode" -Versionen von Delphi ebenso wie von "Unicode-Versionen" zugänglich ist.

Ich vermute, dass die meisten, wenn nicht alle Unicode-Unterstützung, die Sie für die in Ihrer Frage beschriebenen Zwecke benötigen, von der Unicode-Unterstützung in the JEDI JCL erhalten werden können.

Für jede visuelle Komponente Unterstützung benötigen Sie möglicherweise die TNT control set hat den Reiz, frei zu sein.

+0

+1, hervorragendes Argument. Der Code in der akzeptierten Antwort kompiliert und funktioniert auch in Delphi 4 einwandfrei. – mghie

+0

Jetzt ist sogar Delphi in die Traddies und die aktuellen Leute aufgeteilt. –

+1

Ich ziehe es vor, es als "die Arbeit mit einem Minimum an Aufwand, Mühe und Kosten zu erledigen" Menschen und "für Veränderungen Willen zu ändern, ohne darüber nachzudenken, was tatsächlich benötigt wird" Menschen. :) – Deltics