perl脚本无法通过键盘(代码页65001,UTF-8)读取Umlaut字符



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

如果我谈到perl菱形运算符接受管道输入或其他来自文件文本的输入,那么是的,这将是问题519309的副本—如何使用菱形运算符读取Utf-8

然而,这不是关于管道或文件数据,而是关于直接在键盘上键入的输入。因此,我认为,这个问题不是519309的重复。

以下是我问题的细节:

我试图在键盘上使用变音符('ä', 'ö',' ü',…)。

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

如果我对代码页1252使用变音符,那么一切都按预期工作:

C:>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 1252
*** ü
--- ü

但是,如果我在代码页65001 (UTF-8)中使用相同的异变字符,则会得到一个未初始化的警告值,并且不接受该异变字符:

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.
---

如果我将变音符输入到我的perl程序中,那么就没有问题了:

C:>chcp 65001 & echo ü | perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 65001
*** --- ü

为什么我得到这个警告与代码页65001 (UTF-8)?

我使用Windows 7 x64,草莓Perl 5.22。

只是为了记录,如果我使用纯批处理命令(即我不使用perl),那么我可以成功地键入代码页65001 (UTF-8)的变音符元。

C:>chcp 65001 & set /p txt=*** & echo --- %txt%
Page de codes active : 65001
*** ü
--- ü

问题真的是:为什么perl不能接受变调字符的键盘与代码页65001,而非常相同的键盘输入,相同的代码页65001,工作ok作为一个纯dos批处理命令?

在管道上输入变音符元和直接从键盘上输入变音符之间似乎有一些根本的不同。

为什么在键盘上键入一个变音符字符不工作,而同样的事情作为管道字符工作得很好?

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

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

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

更多细节在这里

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

这是微软的错误。Windows api ReadFile()ReadConsoleA()总是返回0字节读取(这表明EOF)在代码页65001。详情请参阅本博客。
由于Microsoft不会修复这个问题,唯一可用的答案是告诉Perl维护者切换到使用ReadConsoleW()并使用WideCharToMultiByte(CP_UTF8, ...)将得到的宽字符转换为utf-8。

最新更新