簡體   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