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

如何使用Perl中的STDIN通过SCIM捕获中文输入?,perl,bash,stdin,cjk,Perl,Bash,Stdin,Cjk,我在Linux上使用SCIM进行中文和日语输入。不幸的是,当我尝试使用Perl的STDIN捕获输入时,输入是疯狂的。当输入罗马字符时,SCIM会尝试猜测正确的最终字符 ^H(退格)代码用于删除命令行上先前建议的字符。(当您键入时,SCIM尝试猜测最终的亚洲字符并显示它们。)但是,这些退格字符按字面意思显示为^H,并且解释不正确 示例一班轮: perl -e 'print "Chinese: "; my $s = <STDIN>; print $s' perl-e'打印“中文:”;我

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

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

示例一班轮:

perl -e 'print "Chinese: "; my $s = <STDIN>; print $s'
perl-e'打印“中文:”;我的$s=;打印$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你好

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

这与在Perl的STDIN期间解释退格字符(或控制字符)有关


见证人:
read-p'Chinese:s&&echo$s
问题是您需要一些东西来解释退格字符。正常的bash提示符会这样做。如果您关闭SCIM并键入
caot
,它看起来像您键入的
cot
,但Perl会将其视为
ca^Hot

您可以使用一个成熟的readline包(比如和一个合适的后端),也可以在读取字符串后修复字符串。有一个模块可以做到这一点,但它似乎不是Unicode安全的,这几乎使它无法用于此应用程序

下面是一些应该可以工作的代码:

my $s = <STDIN>; 
1 while $s =~ s/(?!\cH)\X\cH//g;   # Delete character-backspace pair
print $s;
my$s=;
1而$s=~s/(?!\cH)\X\cH//g;#删除字符退格对
打印$s;

您可能需要创建一个子例程来处理此问题。

我想您可能需要告诉Perl stdin上的编码是什么。我不知道如何做到这一点。:|@Robert p:
binmode stdin,”:encoding(UTF-8)";。但我不认为这是问题所在。试着
read-ep'Chinese:&echo$s
看看使用
readline
是否会影响事情。