perl脚本不接受通过键盘(代码页65001,UTF-8)读取的Umlaut字符

perl脚本不接受通过键盘(代码页65001,UTF-8)读取的Umlaut字符,perl,batch-file,Perl,Batch File,请允许我首先声明,这个问题与perl diamond运算符接受直接在键盘上键入的输入严格相关 如果我谈到perl diamond运算符接受通过管道或其他方式从文件中的文本输入,那么是的,这将是问题519309的重复 但是,这与管道或文件数据无关,而是与直接在键盘上键入的输入有关。因此,我认为,这个问题不是519309的翻版 以下是我问题的细节: 我试图在键盘上使用umlaut字符(‘ä’、‘ö’、‘ü’、…) 我有一个非常简单的perl脚本,它接受来自键盘的一行,然后立即再次打印到屏幕上: 如果

请允许我首先声明,这个问题与perl diamond运算符接受直接在键盘上键入的输入严格相关

如果我谈到perl diamond运算符接受通过管道或其他方式从文件中的文本输入,那么是的,这将是问题519309的重复

但是,这与管道或文件数据无关,而是与直接在键盘上键入的输入有关。因此,我认为,这个问题不是519309的翻版

以下是我问题的细节:

我试图在键盘上使用umlaut字符(‘ä’、‘ö’、‘ü’、…)

我有一个非常简单的perl脚本,它接受来自键盘的一行,然后立即再次打印到屏幕上:

如果我在代码页1252中使用umlaut字符,那么一切都会按预期进行:

C:\>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 1252
*** ü
--- ü
真正的问题是:为什么perl不能通过带有代码页65001的键盘接受umlaut字符,而相同的键盘输入,相同的代码页65001,作为纯dos批处理命令正常工作

管道输入的umlaut字符和直接从键盘输入的umlaut字符之间似乎有着本质上的不同


为什么在键盘上键入umlaut字符不起作用,而同样的操作与管道字符完全一样?

尝试将控制台字体更改为“Lucida console”

您还可以尝试在控制台中运行
chcp 65001
。此命令将字符设置为UTF-8

如果显示错误,请在系统中安装所需字体

更多细节


实际上,这个问题不属于perl。它属于windows终端。试试它是如何工作的。您可以登录到从输入读取的一些二进制数据文件,并比较这两种情况(终端与cygwin)

这是Microsoft的错误。Windows API
ReadFile()
ReadConsoleA()
始终返回代码页65001上读取的0字节(表示EOF)。有关详细信息,请参阅。

由于Microsoft不会解决此问题,唯一可用的答案是告诉Perl维护人员切换到使用
ReadConsoleW()
,并使用
WideCharToMultiByte(CP\u UTF8,…)

将生成的宽字符转换为utf-8,您尝试过选项
-CS
?(
perl-CS-we
)为了使STDIN和STDOUT使用UTF-8编码,我尝试了perl-CS-we——这非常适合打印到STDOUT,但出于某种原因,它对STDIN没有影响(也就是说:我仍然有完全相同的问题——未初始化的值)
CHCP 65001
cmd中的utf-8支持在与外部应用程序(如
perl
)一起使用时很脆弱。这就是像ConEmu这样的包装器派上用场的地方。@wOxxOm我认为代码页65001的问题在于CMD.exe和perl.exe之间的交互——就STDOUT而言,一切正常,但STDIN仍然不工作,即使使用perl-CS-we)我想这是perl本身的输入函数,因为即使键入
xzüxz
也会导致
使用未初始化值$txt…
的错误消息。当至少有一个umlaut且
'
具有相同效果时,将删除完整输入。我想是每个角色都>127
C:\>chcp 65001 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 65001
*** ü
Use of uninitialized value $txt in print at -e line 1.
---
C:\>chcp 65001 & echo ü | perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 65001
*** --- ü
C:\>chcp 65001 & set /p txt=*** & echo --- %txt%
Page de codes active : 65001
*** ü
--- ü