2010-02-17 10 views
7

Necesito escribir un programa que explore cadenas de varias longitudes y seleccione solo aquellas que están escritas usando símbolos del conjunto definido por mí (particularmente letras japonesas). Las cadenas contendrán palabras escritas en diferentes idiomas (alemán, francés, árabe, ruso, inglés, etc.). Obviamente hay una gran cantidad de personajes posibles. No sé qué estructura usar para eso? Estoy usando Delphi 7 ahora mismo. ¿Alguien puede sugerir cómo escribir dicho programa?Trabajando con cadenas Unicode en Delphi 7

Respuesta

12

Obviamente, estarías mejor con Delphi 2010, ya que la VCL en Delphi 7 no tiene conocimiento de las cadenas Unicode. Puede usar los tipos WideString y WideChar en Delphi 7, y puede instalar un conjunto de componentes como los componentes TNT Unicode para ayudarlo a crear una interfaz de usuario que pueda mostrar sus resultados.

Para un tipo muy grande, considere usar una matriz de bits como TBits. Una matriz de bits de longitud 65536 sería suficiente para contener cada punto de código UTF-16. Verificando Char X es en conjunto Y, sería básicamente:

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 todos los buenos bits en la respuesta. Bigsets, TNT y recomiendan no hacer esto en D7 en absoluto. –

+0

Escribí un código de código más útil aquí para usted, Tofig –

+0

Una gran característica de la clase Delphi 2010 TStringList es la capacidad de cargar un archivo desde el disco, determinar automáticamente la codificación UTF8 o UTF16 desde los marcadores de bytes, y así sucesivamente. Esa es otra parte de su tarea, Tofig, que será más complicada en la versión de Delphi anterior a 2009/2010. –

5

también recomiendo cambiar a Delphi 2010 (¿por qué molestarse con 2.009 más?)!

Si en el caso improbable de estar atrapado con Delphi 7, el Unicode Library de Mike Lischke puede ser de alguna ayuda.

+0

enlace está roto ahora – CyprUS

+0

@CyprUS, reparado! –

5

Para el procesamiento simple de cadenas de la manera descrita, no se deje intimidar por las sugerencias de que debe actualizar al último compilador y marco compatible con Unicode. El soporte de Unicode en sí mismo es, por supuesto, proporcionado por la API subyacente de Windows que, por supuesto (directamente), se puede acceder desde versiones "no Unicode" de Delphi tanto como desde "versiones Unicode".

Sospecho que la mayoría, si no la totalidad, del soporte Unicode que necesita para los fines descritos en su pregunta puede obtenerse a partir del soporte Unicode proporcionado en the JEDI JCL.

Para cualquier soporte de componentes visuales que necesite el TNT control set tiene el atractivo de ser gratuito.

+0

+1, excelente argumento. El código en la respuesta aceptada se compila y funciona sin problemas en Delphi 4 incluso. – mghie

+0

Ahora, incluso Delphi se divide en Traddies y las personas actualizadas. –

+1

Prefiero pensar que es "hacer el trabajo con el mínimo de trabajo, molestar y gastar" a las personas y "cambiar por los cambios sin preocuparse por lo que realmente se necesita". :) – Deltics