在这个输出中,为什么在打印非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的博客“排序全部” ,他回应了题为“在普通网站中隐藏的文章:一个被窃取的信类错误报告”的文章 。 他是微软的国际化专家,所以你一定会找到一些见解。
我没有得到任何换行符。 你的命令行是否足够适合你的输出?