Perl的Unicode毛刺

在这个输出中,为什么在打印非ASCII的Unicode字符之后我得到额外的换行符?

平台是Windows Vista,问题出现在chcp 65001而不是chcp 850

 C:\> chcp 850
有效代码页:850

 C:\> perl unicode_bug_1.pl
百威
百威
百威
 Bud-øjovick├¢Budvar
 Bud-øjovick├¢Budvar
 Bud-øjovick├¢Budvar

 C:\> chcp 65001
有效代码页:65001

 C:\> perl unicode_bug_1.pl
百威
百威
百威
 BudějovickýBudvar

 BudějovickýBudvar

 BudějovickýBudvar

从这个程序

 #!perl use strict; use warnings; binmode (STDOUT, "encoding(UTF-8)"); # so no "Wide character in print" warning print "Budweiser\n" for 1..3; print "Bud\N{U+011B}jovick\N{U+00FD} Budvar\n" for 1..3; 

这似乎是Perl中的一个错误。 我原以为这是Windows代码页65001中的一个错误,并不是真的被控制台所支持,但是我终于在C和Perl中做了测试程序,并且这个问题在C版本中不会发生。 不管在哪里出现Unicode字符,但是您打印的行必须比控制台支持更宽。

这是我的C程序:

 #include "stdafx.h" #include "Windows.h" int _tmain(int argc, _TCHAR* argv[]) { BOOL b = SetConsoleOutputCP(65001); printf("set console output codepage returned %d\n", b); printf("cαfe\n"); printf("1234567890 café\n"); printf("1234567890 1234567890 cαfe\n"); printf("1234567890 1234567890 1234567890 café\n"); printf("1234567890 1234567890 1234567890 1234567890 cαfe\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"); printf("1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"); return 0; } 

这是我的Perl程序:

 # use utf8; binmode STDOUT, ':utf8'; printf STDOUT "cαfe\n"; printf STDOUT "1234567890 café\n"; printf STDOUT "1234567890 1234567890 cαfe\n"; printf STDOUT "1234567890 1234567890 1234567890 café\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 cαfe\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 café\n"; printf STDOUT "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 cαfe\n"; 

UPDATE

不,我错了,在irc.perl.org上#perl的一些人的帮助下,它变成了Microsoft API中的一个错误。 WriteFile被记录为返回写入的字节数,但返回写入的字符数,这取决于代码页。 2010年3月发生了一个错误 。

在MSDN论坛中有更多的讨论。

更新2

我发布了关于这个问题的Michael Kaplan的博客“排序全部” ,他回应了题为“在普通网站中隐藏的文章:一个被窃取的信类错误报告”的文章 。 他是微软的国际化专家,所以你一定会找到一些见解。

我没有得到任何换行符。 你的命令行是否足够适合你的输出?