如何在Perl中使用STDIN通过SCIM捕获中文输入?

时间:2010-05-22 04:44:30

标签: perl bash stdin cjk

我在Linux上使用SCIM进行中文和日文输入。不幸的是,当我尝试使用Perl的STDIN捕获输入时,输入很疯狂。当输入罗马字符时,SCIM会尝试猜测正确的最终字符。

^ H(退格)代码用于删除命令行上以前建议的字符。 (当您键入时,SCIM会尝试猜测最终的亚洲字符并显示它们。)但是,这些退格字符字面上显示为^ H且未正确解释。

示例单线:

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

当我启用SCIM中文或日语输入时,如我输入的那样,例如,nihao =&gt;你好,结果如下:

  

你1 H你1 H你1 H你1 H你1 H你好1 H 1 H你好1 H 1 H你好1 H 1 H你哈1 H 1 H你哈1 H 1 H你哈1 H 1 H你好1 H 1 H你好1 H 1 H你好1 H 1 H你好

在这个字符串的最后,你可以看到“你好”(nihao / hello)。 在正常的bash提示下,如果我输入nihao(启用中文),结果就很完美。

这与在Perl的STDIN期间解释退格字符(或控制字符)有关。在Bash中使用命令'read'时会发生同样的事情。

证人:read -p 'Chinese: ' s && echo $s

1 个答案:

答案 0 :(得分:3)

问题是你需要一些东西来解释退格字符。正常的bash提示就是这样做的。如果您关闭SCIM并输入ca<BACKSPACE>ot<ENTER>,则表示您输入cot,但Perl会将其视为ca^Hot

您可以使用完整的readline包(例如Term::ReadLine和合适的后端),或者您可以在阅读后修复字符串。有一个Clean::Backspace模块可以做到这一点,但它似乎不是Unicode安全的,这几乎使它无法用于此应用程序。

这是对一些应该运行的代码的快速尝试:

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

您可能想要制作一个子程序来处理这个问题。