繁体   English   中英

印有chcp 65001的Windows UTF-8-神秘地复制了字符

[英]Windows UTF-8 printed with chcp 65001 - characters are mysteriously duplicated

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

我正在使用Windows 7和Strawberry Perl 5.20,并且我想使用chcp 65001将UTF-8写入控制台(cmd.exe)。

UTF-8字符本身可以很好地显示,甚至> 255,但是某些角色有一个神秘的重复(仅当我不重定向到文件时才会发生)

编辑:我现在已经看到另一篇文章, 当我的perl-program-outputs-a-utf-8重复时,最后一个八位字节处具有相同的问题-解决方案是注入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

就像我说的那样,字符本身是正确打印的,但是为什么会有这种神秘的重复呢? ...以及为什么*仅*(如果未重定向到文件中)?

如我所怀疑,这被报告为Windows软件失败:

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

我不知道有一种解决方法,但是如果:unix:encoding(utf8):crlf crlf PerlIO堆栈为您工作,那么看来您已经找到了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM