Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用chcp 65001打印的Windows UTF-8-字符被神秘地复制_Windows_Perl_Utf 8 - Fatal编程技术网

使用chcp 65001打印的Windows UTF-8-字符被神秘地复制

使用chcp 65001打印的Windows UTF-8-字符被神秘地复制,windows,perl,utf-8,Windows,Perl,Utf 8,有一件事我想不通: 我正在使用Windows7和草莓Perl5.20,我想用CHCP65001将UTF-8写入控制台(cmd.exe) UTF-8字符本身表现良好,甚至超过255个,但有些字符存在神秘的重复(只有在不重定向到文件时才会发生这种情况) 编辑: 我现在看到的另一篇文章本质上也有同样的问题——解决方案是将binmode(STDOUT,'unix:encoding(utf8):crlf')注入到perl程序中——我已经测试过了,现在它工作正常 感谢所有研究这个奇怪问题的人 简而言之,我正

有一件事我想不通:

我正在使用Windows7和草莓Perl5.20,我想用CHCP65001将UTF-8写入控制台(cmd.exe)

UTF-8字符本身表现良好,甚至超过255个,但有些字符存在神秘的重复(只有在不重定向到文件时才会发生这种情况)

编辑: 我现在看到的另一篇文章本质上也有同样的问题——解决方案是将binmode(STDOUT,'unix:encoding(utf8):crlf')注入到perl程序中——我已经测试过了,现在它工作正常

感谢所有研究这个奇怪问题的人

简而言之,我正在编写一个UTF-8字符串(chr(300)x 3).chr(301)。“UVW\x{0D}\x{0A}”,当我重定向到平面文件,然后打印平面文件时,一切正常

然而,当我直接打印到控制台时,一些字符被神秘地复制(我在单独的行中谈论的是字符“VW”),我不知道为什么

这是我的测试输出

Page de codes active : 65001

Redirected into a file:
-----------------------
ĬĬĬĭUVW

Printed directly:
-----------------
ĬĬĬĭUVW
VW

IO-Layers = (unix crlf)

C4ACC4ACC4ACC4AD5556570D0A
这是我的测试程序:

@echo off
chcp 65001
echo.

set H1=BEGIN{binmode(*STDIN); undef $/;
set HEXDUMP="%H1% print uc(unpack('H*',<STDIN>)), qq{\n}}"

set L1=my @l = PerlIO::get_layers(*STDOUT, output, 1);
set LAYERS="%L1% print {*STDERR} qq{IO-Layers = (@l)\n};"

set PROG="print chr(300) x 3, chr(301), qq{UVW\n};";

set TFILE=%TEMP%\tfile.txt

echo Redirected into a file:
echo -----------------------
perl -C6 -e%PROG% >%TFILE% && type %TFILE%
echo.

echo Printed directly:
echo -----------------
perl -C6 -e%PROG%

echo.
perl -e%LAYERS%
echo.

perl -e%HEXDUMP% <%TFILE%

echo.
pause
@echo关闭
chcp 65001
回声。
set H1=BEGIN{binmode(*STDIN);undef$/;
set hextdump=“%H1%print uc(unpack('H*',)),qq{\n}”
设置L1=my@l=PerlIO::get_层(*STDOUT,output,1);
set LAYERS=“%L1%print{*STDERR}qq{IO LAYERS=(@l)\n};”
set PROG=“打印chr(300)x 3,chr(301),qq{UVW\n};”;
设置TFILE=%TEMP%\TFILE.txt
echo已重定向到文件:
回音-----------------------
perl-C6-e%PROG%>%TFILE%&类型%TFILE%
回声。
echo直接打印:
回音-----------------
perl-C6-e%PROG%
回声。
perl-e%LAYERS%
回声。

perl-e%hextump%正如我所怀疑的,这已被报告为Windows软件中的故障:

这是由Windows中的错误引起的。当写入设置为代码页65001的控制台时,WriteFile()返回写入的字符数,而不是字节数


我不知道有什么解决办法,但如果
:unix:encoding(utf8):crlf
PerlIO堆栈适合您,那么您似乎已经找到了一个。

为什么要打印U+0300和U+0301,它们分别是“组合严重重音”和“组合尖锐重音”?这些重音应该应用于前面的字符。另外,Windows系统上的Perl将
“\n”
隐式转换为CRLF,并且不需要自己打印U+000D。啊,我明白了。您的实际代码发送十进制300和301,即U+012C和U+012D,分别为“大写字母I-breve”和“小写字母I-breve”,与您所说的输出相匹配。即便如此,你为什么要打印这么奇怪的东西呢?我打印这些奇怪的东西是为了测试我的程序在输出方面是否坚如磐石。我编辑了我的文本,以反映我的代码发送十进制300和301I。我看到另一篇文章,基本上存在相同的问题——解决方法是注入一个binmode(标准输出,'unix:encoding(utf8):crlf')转换到perl程序中——我已经测试过了,现在可以正常工作了