2010-02-17 6 views
7

J'ai besoin d'écrire un programme qui va parcourir des chaînes de différentes longueurs et sélectionner uniquement celles qui sont écrites en utilisant des symboles d'ensemble définis par moi (en particulier les lettres japonaises). Les chaînes contiendront des mots écrits en différentes langues (allemand, français, arabe, russe, anglais, etc.). Évidemment, il y a énormément de caractères possibles. Je ne sais pas quelle structure utiliser pour ça? J'utilise Delphi 7 en ce moment. Quelqu'un peut-il suggérer comment écrire un tel programme?Travailler avec des chaînes Unicode dans Delphi 7

Répondre

12

De toute évidence, vous seriez mieux avec Delphi 2010, puisque la VCL de Delphi 7 n'est pas au courant des chaînes Unicode. Vous pouvez utiliser les types WideString et WideChar dans Delphi 7, et vous pouvez installer un ensemble de composants comme les composants TNT Unicode pour vous aider à créer une interface utilisateur capable d'afficher vos résultats.

Pour un type à très grand ensemble, pensez à utiliser un tableau de bits comme TBits. Un tableau de longueur 65536 suffirait à contenir tous les points de code UTF-16. Vérifier si Char X est Set Y, serait essentiellement:

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 tous les bons bits dans la réponse. bigsets, TNT et recommande de ne pas le faire en D7 du tout. –

+0

J'ai écrit un peu de code plus utile ici pour vous, Tofig –

+0

Une grande fonctionnalité dans Delphi 2010 classe TStringList est la possibilité de charger un fichier à partir du disque, déterminer automatiquement l'encodage UTF8 ou UTF16 à partir des octets, et ainsi de suite. C'est une autre partie de votre tâche, Tofig, qui sera rendue plus délicate sur la version de Delphi antérieure à 2009/2010. –

5

Je vous recommande également de passer à Delphi 2010 (pourquoi embêter avec 2009 plus?)!

Si dans le cas improbable où vous êtes coincé avec Delphi 7, le Unicode Library de Mike Lischke peut être utile.

+0

le lien est brisé maintenant – CyprUS

+0

@CyprUS, fixe! –

5

Pour le traitement simple des chaînes de la manière que vous décrivez, ne soyez pas rebutés par des suggestions selon lesquelles vous devriez effectuer la mise à niveau vers la dernière version du compilateur et du framework Unicode. Le support Unicode lui-même est bien sûr fourni par l'API Windows sous-jacente qui est bien sûr (directement) accessible à partir de versions "non-Unicode" de Delphi tout autant que de "versions Unicode".

Je suppose que la plupart, sinon la totalité du support Unicode dont vous avez besoin pour les objectifs décrits dans votre question peuvent être obtenus à partir du support Unicode fourni au the JEDI JCL.

Pour tout support de composants visuels dont vous pourriez avoir besoin, le TNT control set a l'appel d'être gratuit.

+0

+1, excellent argument. Le code dans la réponse acceptée compile et fonctionne parfaitement dans Delphi 4 même. – mghie

+0

Maintenant, même Delphi est divisé en Traddies et les gens à jour. –

+1

Je préfère penser à «faire le travail avec le minimum de tracas, déranger et dépenser» les gens et «changer pour changer les choses sans penser à ce qui est réellement nécessaire» les gens. :) – Deltics

Questions connexes