2009-02-23 9 views
8

¿Alguien tiene un ejemplo de código para un programa de cadenas con reconocimiento de Unicode? El lenguaje de programación no importa. Quiero algo que esencialmente haga lo mismo que el comando de Unix "cadenas", pero que también funcione en texto unicode (UTF-16 o UTF-8), tirando de caracteres en inglés y signos de puntuación. (Solo me interesan los caracteres ingleses, no cualquier otro alfabeto).Unicode-aware cadenas (1) programa

Gracias!

+1

Para inglés solamente y UTF-8, las cadenas (1) ya deberían estar bien. – mouviciel

+0

Si el idioma no importa, ¿por qué no comprueba el origen de la utilidad de cadenas en sí? –

Respuesta

8

¿Desea utilizarlo o, por alguna razón, insista en el código?

En mi sistema Debian, parece que el comando strings puede hacerlo de la caja. Ver el exercept de la página de manual:

--encoding=encoding 
     Select the character encoding of the strings that are to be found. Possible values for encoding are: s = single-7-bit-byte characters (ASCII, ISO 8859, 
     etc., default), S = single-8-bit-byte characters, b = 16-bit bigendian, l = 16-bit littleendian, B = 32-bit bigendian, L = 32-bit littleendian. Useful 
     for finding wide character strings. 

Editar: OK. No sé C# así que esto puede ser un poco peludo, pero básicamente, necesitas buscar secuencias de ceros alternados y caracteres ingleses.

byte b; 
int i=0; 
while(!endOfInput()) { 
    b=getNextByte(); 
LoopBegin: 
    if(!isEnglish(b)) { 
    if(i>0) // report successful match of length i 
    i=0; 
    continue; 
    } 
    if(endOfInput()) break; 
    if((b=getNextByte())!=0) 
    goto LoopBegin; 
    i++; // found another character 
} 

Esto debería funcionar para little-endian.

+0

Necesito el código ... Necesito incorporarlo en un sistema que estoy escribiendo (en C#, si es importante). – Evan

+0

Gracias, exactamente lo que necesitaba. Muy obvio, ahora que lo pienso; solo omita los bytes nulos. – Evan

1

Tuve un problema similar y probé el "strings -e ...", pero acabo de encontrar opciones para la codificación de caracteres de ancho de corrección. (La codificación UTF-8 es de ancho variable).

Remeber thar por defecto los caracteres fuera de ascii necesitan opciones adicionales strings. Esto incluye casi todas las cadenas de idioma que no sean en inglés.

Sin embargo, la salida "-e S" (caracteres individuales de 8 bits) incluye caracteres UTF-8.

Escribí un script Perl muy simple (de opinión) que aplica un "strings -e S ... | iconv ..." a los archivos de entrada.

Creo que es fácil ajustarlo para restricciones específicas. Uso: utf8strings [options] file*

#!/usr/bin/perl -s 

our ($all,$windows,$enc); ## use -all ignore the "3 letters word" restriction 
use strict; 
use utf8::all; 

$enc = "ms-ansi" if  $windows; ## 
$enc = "utf8" unless $enc ; ## defaul encoding=utf8 
my $iconv = "iconv -c -f $enc -t utf8 |"; 

for (@ARGV){ s/(.*)/strings -e S '$1'| $iconv/;} 

my $word=qr/[a-zçáéíóúâêôàèìòùüãõ]{3}/i; # adapt this to your case 

while(<>){ 
    # next if /regular expressions for common garbage/; 
    print if ($all or /$word/); 
} 

En algunas situaciones, este enfoque producir un poco de basura extra.

Cuestiones relacionadas