2009-02-23 3 views
8

누구나 유니 코드 인식 문자열 프로그램에 대한 코드 샘플이 있습니까? 프로그래밍 언어는 중요하지 않습니다. 나는 본질적으로 유닉스 명령 "문자열"과 같은 것을 원하지만, 유니 코드 텍스트 (UTF-16 또는 UTF-8)에서 작동하여 영어 문자와 구두점을 사용한다. (나는 영어 문자 만 신경 쓰며 다른 알파벳은 신경 쓰지 않는다.)유니 코드 인식 문자열 (1) 프로그램

감사합니다.

+1

영어와 UTF-8의 경우 문자열 (1)은 이미 정상이어야합니다. – mouviciel

+0

언어가 중요하지 않은 경우 문자열 유틸리티 자체의 소스를 확인하는 것이 어떻습니까? –

답변

8

그냥 사용 하시겠습니까, 아니면 코드를 고집하는 이유가 무엇입니까?

내 데비안 시스템에서는 strings 명령을 통해이 작업을 수행 할 수 있습니다. 맨페 제외 제목 :

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

편집 : 확인 : 확인. 나는 C#을 모르므로 약간 털이 있지만 기본적으로 0과 영문자가 교대로 반복되는 시퀀스를 검색해야합니다.

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 
} 

리틀 엔디안에서 작동합니다.

+0

코드가 필요합니다 ... 필자가 작성한 시스템에이 코드를 통합해야합니다 (중요하면 C#으로). – Evan

+0

감사합니다. 정확하게 필요한 것. 꽤 분명해. 이제 생각해 봐. 그냥 null 바이트를 건너 뜁니다. – Evan

1

나는 비슷한 문제가있어서 "strings -e ..."을 시도했지만 수정 폭 너비 문자 인코딩 옵션을 찾았습니다. (UTF-8 인코딩은 가변 폭입니다).

기본적으로 아스키 외부 문자는 여분의 strings 옵션이 필요합니다. 여기에는 거의 모든 영어가 아닌 문자열이 포함됩니다.

그럼에도 불구하고 "-e S"(단일 8 비트 문자) 출력에는 UTF-8 문자가 포함됩니다.

입력 파일에 "strings -e S ... | iconv ..."을 적용하는 매우 간단한 (의견이있는) Perl 스크립트를 작성했습니다.

나는 그것이 특정한 제한을 위해 그것을 튜닝하는 것이 쉽다라고 생각한다. 사용법 : 어떤 상황에서 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/); 
} 

는,이 방법은 몇 가지 여분의 쓰레기를 생산하고 있습니다.