1

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

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

单行示例:

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

当我启用 SCIM 中文或日文输入时,当我键入时,例如 nihao => 你好,结果如下:

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

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

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

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

4

1 回答 1

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;

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

于 2010-05-22T08:15:13.953 回答