Как мне захватить китайский ввод через SCIM с STDIN в Perl? - PullRequest
1 голос
/ 22 мая 2010

Я использую SCIM в Linux для ввода китайского и японского языков. К сожалению, когда я пытаюсь захватить ввод с помощью Perl STDIN, ввод сходит с ума. При вводе латинских символов SCIM пытается угадать правильные конечные символы.

^ H (backspace) коды используются для удаления ранее предложенных символов в командной строке. (По мере ввода SCIM пытается угадать окончательные азиатские символы и отображает их.) Однако эти символы возврата на задний план отображаются буквально как ^ H и интерпретируются неправильно.

Пример одной строки:

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

Когда я включаю ввод SCIM на китайском или японском языке, когда я печатаю, например, nihao => 你好, вот результат:

你 ^ Н ^ Н 你 你 ^ Н ^ Н 你 你 ^ Н 你好 ^ Н ^ Н 你好 ^ Н ^ Н 你好 ^ Н ^ Н 你 哈 ^ Н ^ Н 你 哈 ^ Н ^ Н 你 哈^ H ^ H 你好 ^ H ^ H 你好 ^ H ^ H 你好 ^ H ^ H 你好

В самом конце этой строки вы можете увидеть «你好» (nihao / hello). При обычной подсказке bash, если я наберу nihao (с включенным китайским), результат будет идеальным.

Это как-то связано с интерпретацией символов возврата (или контрольных символов) во время STDIN в Perl. То же самое происходит при использовании команды 'read' в Bash.

Свидетель: read -p 'Chinese: ' s && echo $s

1 Ответ

3 голосов
/ 22 мая 2010

Проблема в том, что вам нужно что-то для интерпретации символов возврата. Обычное приглашение bash делает это. Если вы выключите SCIM и наберете ca<BACKSPACE>ot<ENTER>, это будет выглядеть так, как будто вы набрали cot, но Perl увидит это как ca^Hot.

Вы можете использовать полноценный пакет readline (например, Term :: ReadLine и подходящий back-end), или вы можете просто исправить строки после их прочтения. Для этого есть модуль Clean :: Backspace , но он не является безопасным для Unicode, что делает его непригодным для использования в этом приложении.

Вот быстрый пример кода, который должен работать:

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

Возможно, вы захотите создать подпрограмму для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...