2010-12-31 2 views
5

В этом выпуске, почему я получаю дополнительные строки новой строки после печати символов без символов ASCII Unicode?Perl Unicode glitch

Платформа 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; 
+2

Идея не существует; не для меня. Можете ли вы рассказать нам что-нибудь об окружающей среде, в которой вы работаете? – ysth

ответ

3

Это, кажется, ошибка в Perl. Я думал, что ошибка в кодовой странице Windows 65001 на самом деле не поддерживается консолью, но я, наконец, сделал тестовые программы на C и Perl, и проблема не возникает в версии C. Это происходит независимо от того, где символ Юникода встречается в строке, но строка, которую вы печатаете, должна быть шире, чем поддерживается консолью.

Вот моя 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

Нет, я был неправ, с помощью некоторых из ребята в #perl на irc.perl.org, это оказывается ошибкой в ​​API Microsoft. WriteFile задокументировано, чтобы вернуть число байт записано, но возвращает число символов, которое зависит от кодовой страницы. A bug was filed in March 2010.

Больше об обсуждении in the MSDN forums.

UPDATE 2

я отправил блог Майкла Каплана, "Sorting it all out", об этой проблеме, и он ответил на статью под названием "Hidden in plain site: a purloined letter kind of a bug report". Он эксперт по интернационализации Microsoft, поэтому вы наверняка найдете там некоторые идеи ...

0

Я не получаю никаких новых строк. Является ли ваша командная строка достаточно широкой, чтобы соответствовать вашему результату?

+0

Моя командная строка достаточно широка, но я заметил, что проблема не возникает, если я установил кодовую страницу на 850, используя 'chcp 850' - однако тогда символы не будут отображаться правильно. Windows Vista 32-бит, активировать Perl 5.10.0 MSWin32-x86-multi-thread. – RedGrittyBrick

+0

Выход chcp здесь: 932. Попробуйте, может быть? – Hugmeir

+0

@RedGrittyBrick, я не вижу описанной проблемы в 64-разрядной версии Windows Vista, активируйте Perl 5.10.1 MSWin32-x86-multi-thread. Возможно, попробуйте обновить свою установку на Perl. –

Смежные вопросы