用UTP 65001打印的Windows UTF-8 - 字符神秘复制

时间:2014-08-30 17:53:59

标签: windows perl utf-8

这是我无法理解的一件事:

我正在使用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

正如我所说,角色本身印刷正确,但为什么会出现这种神秘的重复? ...以及为什么*仅*如果没有重定向到文件中?

1 个答案:

答案 0 :(得分:3)

据我所知,这已被报道为Windows软件失败:

  

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

我不知道解决方法,但如果:unix:encoding(utf8):crlf PerlIO堆栈适用于您,那么您似乎找到了它。