2009-02-23 2 views
8

Czy ktoś ma próbkę kodu dla programu napisów obsługujących Unicode? Język programowania nie ma znaczenia. Chcę czegoś, co w zasadzie robi to samo, co polecenie "łańcuchy" Uniksa, ale działa również na tekstach Unicode (UTF-16 lub UTF-8), ciągnąc ciągi znaków w języku angielskim i interpunkcji. (Dbam tylko o angielskie znaki, nie o żaden inny alfabet).Ciągi obsługujące Unicode (1) program

Dzięki!

+1

Tylko w języku angielskim i UTF-8 łańcuchy (1) powinny już być w porządku. – mouviciel

+0

Jeśli język nie ma znaczenia, dlaczego nie sprawdzasz źródła samego narzędzia string? –

Odpowiedz

8

Czy po prostu chcesz go użyć, czy też z jakiegoś powodu nalegasz na kod?

W moim systemie Debian wygląda na to, że polecenie strings może to zrobić po wyjęciu z pudełka. Zobacz przykład strony man:

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

Edytuj: OK. Nie znam C#, więc może to być trochę owłosione, ale w zasadzie trzeba szukać sekwencji zera na przemian i angielskich znaków.

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 
} 

To powinno działać dla little-endian.

+0

Potrzebuję kodu ... Muszę włączyć go do systemu, który piszę (w języku C#, jeśli to ma znaczenie). – Evan

+0

Dzięki, dokładnie to, czego potrzebowałem. Dość oczywiste, teraz, kiedy o tym myślę; po prostu pomiń bajty zerowe. – Evan

1

Miałem podobny problem i wypróbowałem "strings -e ...", ale właśnie znalazłem opcje kodowania znaków o stałej szerokości. (Kodowanie UTF-8 ma zmienną szerokość).

Pamiętaj, że domyślnie znaki poza ascii potrzebują dodatkowych opcji strings. Obejmuje to prawie wszystkie łańcuchy w języku innym niż angielski.

Mimo to, "-e S" dane wyjściowe "single 8 bit chars" zawierają znaki UTF-8.

Napisałem bardzo prosty (opinii) skrypt Perla, który stosuje "strings -e S ... | iconv ..." do plików wejściowych.

Uważam, że łatwo jest dostroić go do określonych ograniczeń. Zastosowanie: 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/); 
} 

W niektórych sytuacjach takie podejście produkować dodatkowe śmieci.