2010-05-22 2 views
1

중국어와 일본어 입력을 위해 Linux에서 SCIM을 사용합니다. 불행히도 Perl의 STDIN을 사용하여 입력을 캡처하려고하면 입력이 미친 것입니다. 로마 문자가 입력되면 SCIM은 올바른 최종 문자를 추측합니다.Perl에서 STDIN으로 SCIM을 통해 중국어 입력을 캡처하는 방법은 무엇입니까?

^H (백 스페이스) 코드는 명령 줄에서 이전에 제안 된 문자를 삭제하는 데 사용됩니다. (입력 할 때 SCIM은 최종 아시아 문자를 추측하여 표시합니다.) 그러나 이러한 백 스페이스 문자는 문자 그대로^H로 표시되고 올바르게 해석되지 않습니다.

일례 라이너 :

你 : 여기에서 결과 => 你好

perl -e 'print "Chinese: "; my $s = <STDIN>; print $s' 

I는 입력 I가 SCIM 중국어 또는 일본어 인 에이블 입력, 예 nihao^H^H^H^^ H^H^H^H^H^H^^^

이 문자열의 맨 마지막 부분에 "好 "(nihao/안녕하세요). 정상적인 bash 프롬프트에서 nihao (중국어 사용 가능)를 입력하면 결과가 완벽합니다.

이것은 펄의 STDIN 동안 백 스페이스 문자 (또는 제어 문자)의 해석과 관련이 있습니다. Bash에서 'read'명령을 사용할 때도 똑같은 일이 발생합니다.

증인 : read -p 'Chinese: ' s && echo $s

+0

나는 펄에게 stdin의 인코딩이 무엇인지 말해야한다고 생각한다. 나는 그것을하는 방법을하지만 내 머리 꼭대기에서 모릅니다. : | –

+0

@Robert P :'binmode STDIN, ": 인코딩 (UTF-8)";'. 그러나 나는 그것이 여기의 문제라고 생각하지 않는다. –

+0

'read -ep '중국어를 사용해보십시오 :'readline'을 사용하여 사물에 영향을 주는지 확인하십시오 :'s && echo $ s'. –

답변

3

문제는 당신이 백 스페이스 문자를 해석하는 것이 필요하다는 것입니다. 일반적인 bash 프롬프트는 그렇게합니다. SCIM을 끄고 ca<BACKSPACE>ot<ENTER>을 입력하면 cot을 입력 한 것처럼 보이지만 Perl은이를 ca^Hot으로 보게됩니다.

본격적인 readline 패키지 (예 : Term::ReadLine 및 적합한 백엔드)를 사용할 수도 있고 읽은 후에 문자열을 수정할 수도 있습니다. 이 작업을 수행하는 모듈은 Clean::Backspace입니다.하지만이 응용 프로그램에서는 거의 사용할 수 없게되는 유니 코드로 안전하지는 않습니다.

여기에 몇 가지 코드에 빠른 찌르기는 작동한다고입니다 :

my $s = <STDIN>; 
1 while $s =~ s/(?!\cH)\X\cH//g; # Delete character-backspace pair 
print $s; 

당신은 아마이 처리하는 서브 루틴을 할 것입니다.