2009-02-23 11 views
8

Qualcuno ha un esempio di codice per un programma di stringhe con riconoscimento Unicode? Il linguaggio di programmazione non ha importanza. Voglio qualcosa che essenzialmente fa la stessa cosa del comando unix "stringhe", ma che funziona anche su testo Unicode (UTF-16 o UTF-8), tirando esecuzioni di caratteri in inglese e punteggiatura. (Mi interessa solo i personaggi inglesi, non altri alfabeti).Programma stringhe compatibile con Unicode (1)

Grazie!

+1

Solo per l'inglese e UTF-8, le stringhe (1) dovrebbero già essere OK. – mouviciel

+0

Se la lingua non è importante, allora perché non si controlla la fonte dell'utilità delle stringhe stessa? –

risposta

8

Vuoi semplicemente usarlo, o per qualche ragione insisti sul codice?

Sul mio sistema Debian, sembra che il comando strings possa farlo immediatamente. Vedere l'exercept dalla manpage:

--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. 

Modifica: OK. Non conosco C#, quindi potrebbe essere un po 'peloso, ma in pratica devi cercare sequenze di zeri alternati e caratteri inglesi.

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 
} 

Questo dovrebbe funzionare per little-endian.

+0

Ho bisogno del codice ... Devo incorporarlo in un sistema che sto scrivendo (in C#, se è importante). – Evan

+0

Grazie, esattamente quello di cui avevo bisogno. Piuttosto ovvio, ora che ci penso; basta saltare i byte null. – Evan

1

Ho avuto un problema simile e ho provato il "strings -e ..." ma ho appena trovato le opzioni per la codifica di larghezza larghezza dei caratteri. (La codifica UTF-8 è larghezza variabile).

Ricordare che per impostazione predefinita i caratteri all'esterno di ascii necessitano di ulteriori opzioni strings. Questo include quasi tutte le stringhe della lingua inglese.

Tuttavia, l'output "-e S" (8 bit singoli) include i caratteri UTF-8.

Ho scritto uno script Perl molto semplice (parere) che applica uno "strings -e S ... | iconv ..." ai file di input.

Credo sia facile regolarlo per restrizioni specifiche. 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/); 
} 

In alcune situazioni, questo approccio produce un po 'di spazzatura in più.

Problemi correlati