在此输出中,为什么在打印非ASCII Unicode字符后会获得额外的换行符?
平台是Windows Vista,问题发生在chcp 65001
之后,而不是在chcp 850
C:\>chcp 850 Active code page: 850 C:\>perl unicode_bug_1.pl Budweiser Budweiser Budweiser Bud─øjovick├¢ Budvar Bud─øjovick├¢ Budvar Bud─øjovick├¢ Budvar C:\>chcp 65001 Active code page: 65001 C:\>perl unicode_bug_1.pl Budweiser Budweiser Budweiser 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;
答案 0 :(得分: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";
<强>更新强>
不,我错了,在irc.perl.org上的#perl的一些人的帮助下,它变成了Microsoft API中的一个错误。记录WriteFile
以返回写入的字节的数量,但返回写入的字符的数量,这取决于代码页。 A bug was filed in March 2010
还有更多讨论in the MSDN forums。
更新2
我发布了Michael Kaplan的博客"Sorting it all out",关于这个问题,他回复了题为"Hidden in plain site: a purloined letter kind of a bug report"的文章。他是微软国际化专家,所以你肯定会在那里找到一些见解......
答案 1 :(得分:0)
我没有得到任何换行符。你的命令行是否足够宽以适应你的输出?