5

この出力で、非 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
バドワイザー
バドワイザー
バドワイザー
ブジェヨヴィツキー・ブドヴァル

ブジェヨヴィツキー・ブドヴァル

ブジェヨヴィツキー・ブドヴァル

この番組から

#!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;
4

2 に答える 2

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数を返すように文書化されていますが、コードページに依存する書き込まれた文字数を返します。2010 年 3 月にバグが報告されました

MSDN フォーラムでさらに議論が行われています。

更新 2

この問題について、Michael Kaplan のブログ「Sorting it all out」を投稿したところ、彼は「Hidden in plain site: a purloined letter kind of a bug report」というタイトルの記事で応答しました。彼はマイクロソフトの国際化の専門家であるため、きっといくつかの洞察を見つけることができます...

于 2011-02-20T11:36:32.603 に答える
0

改行がありません。コマンド ラインは、出力に合わせて十分な幅がありますか?

于 2010-12-31T21:48:04.623 に答える