这是我无法理解的一件事:
我正在使用Windows 7和Strawberry Perl 5.20,我想用chcp 65001将UTF-8写入控制台(cmd.exe)。
UTF-8字符本身很好,甚至> 255,但是有些字符有一个神秘的重复(只有当我不重定向到文件时才会发生这种情况)
修改 我现在看到另一篇帖子在last-octet-repeated-when-my-perl-program-outputs-a-utf-8有基本相同的问题 - 解决方案是将一个binmode(STDOUT,'unix:encoding(utf8):crlf')注入perl程序 - 我测试过了它现在工作正常
感谢所有关注这个奇怪问题的人。
简而言之,我正在写一个UTF-8字符串(chr(300)x 3).chr(301)。“UVW \ 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
正如我所说,角色本身印刷正确,但为什么会出现这种神秘的重复? ...以及为什么*仅*如果没有重定向到文件中?
答案 0 :(得分:3)
据我所知,这已被报道为Windows软件失败:
这是由Windows中的错误引起的。当写入设置为代码页65001的控制台时,WriteFile()返回写入的字符数而不是字节数。
我不知道解决方法,但如果:unix:encoding(utf8):crlf
PerlIO堆栈适用于您,那么您似乎找到了它。