通过键盘(代码页65001,UTF-8)不接受变音符号由perl脚本读取

use*_*349 10 perl batch-file

请让我首先说明这个问题与perl钻石操作员接受直接键入键盘的输入有关.

如果我谈到perl钻石操作员接受输入已经被管道传输或来自文件中的文本,那么是的,这将是问题519309的重复 - 如何使用钻石操作员阅读Utf-8.

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

以下是我的问题的详细信息:

我正在尝试在键盘上使用变音字符('ä','ö','ü',...).

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

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

C:\>chcp 1252 & perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 1252
*** ü
--- ü
Run Code Online (Sandbox Code Playgroud)

但是,如果我在代码页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.
---
Run Code Online (Sandbox Code Playgroud)

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

C:\>chcp 65001 & echo ü | perl -CS -we"print '*** '; $txt = <>; print '--- ', $txt;"
Page de codes active : 65001
*** --- ü
Run Code Online (Sandbox Code Playgroud)

为什么我会在代码页65001(UTF-8)上收到此警告?

我使用的是Windows 7 x64,带有Strawberry Perl 5.22.

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

C:\>chcp 65001 & set /p txt=*** & echo --- %txt%
Page de codes active : 65001
*** ü
--- ü
Run Code Online (Sandbox Code Playgroud)

真正的问题是:为什么perl不能通过键盘和代码页65001接受变音字符,而相同的键盘输入,相同的代码页65001,作为纯dos批处理命令工作正常?

在管道变音字符和直接从键盘输入变音字符之间似乎存在根本不同的东西.

为什么在键盘上输入变音符号字符不起作用,而同样的东西作为管道字符工作得很好?

Eug*_*kov 2

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

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

如果显示错误 - 将所需的字体安装到系统中。

更多详情请点击这里

其实这个问题不属于perl。它属于Windows终端。尝试一下它在这个控制台中的工作原理。您可以记录从输入读取的一些文件二进制数据并比较这两种情况(终端 VS cygwin)