2010-12-31 12 views
5

In questo output, perché sto ricevendo extra newline dopo la stampa di caratteri Unicode non ASCII?Perl Unicode glitch

piattaforma è Windows Vista e problema si verifica dopo chcp 65001 ma non dopo 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 

da questo programma

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

Nessuna idea; non sta succedendo per me. Puoi dirci qualcosa sull'ambiente in cui stai eseguendo questo? – ysth

risposta

3

Questo sembra essere un bug in Perl. Avevo pensato che un bug nella codepage di Windows 65001 non fosse realmente supportato per la console, ma alla fine ho realizzato programmi di test in C e Perl e il problema non si verificava nella versione C. Accade non importa dove si trova il carattere Unicode nella linea, ma la linea che stai stampando deve essere più larga di quella supportata dalla console.

Ecco il mio programma in 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; 
}

E qui è il mio programma 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

No mi sono sbagliato, con l'aiuto di alcuni dei ragazzi su #perl su irc.perl.org risulta essere un bug nell'API di Microsoft. WriteFile è documentato per restituire il numero di byte scritto ma restituisce il numero di caratteri scritto, che dipende dalla tabella codici. A bug was filed in March 2010.

C'è più discussione in the MSDN forums.

UPDATE 2

ho postato il blog di Michael Kaplan, "Sorting it all out", su questo problema e ha risposto con l'articolo intitolato "Hidden in plain site: a purloined letter kind of a bug report". È un esperto di internazionalizzazione Microsoft, quindi troverai sicuramente alcuni approfondimenti ...

0

Non ricevo alcun capo. La tua riga di comando è sufficientemente ampia per adattarsi al tuo output?

+0

La mia riga di comando è abbastanza ampia ma ho notato che il problema non si verifica se imposto la codepage su 850 utilizzando 'chcp 850' - tuttavia i caratteri non vengono visualizzati correttamente. Windows Vista 32 bit, Activestate Perl 5.10.0 MSWin32-x86-multi-thread. – RedGrittyBrick

+0

output chcp qui: 932. Provalo, forse? – Hugmeir

+0

@RedGrittyBrick, Non vedo il problema descritto su Windows Vista 64-bit, Activestate Perl 5.10.1 MSWin32-x86-multi-thread. Forse prova ad aggiornare l'installazione di Perl. –