我在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
答案 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;
您可能想要制作一个子程序来处理这个问题。