2010-12-31 18 views
5

En esta salida, ¿por qué recibo nuevas líneas adicionales después de imprimir caracteres Unicode que no sean ASCII?Fallo Perl Unicode

plataforma es Windows Vista y problema se produce después chcp 65001 pero no después de 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 

de este programa

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

No tengo idea; no sucediendo para mí. ¿Puede decirnos algo sobre el entorno en el que está ejecutando esto? – ysth

Respuesta

3

Esto parece ser un error en Perl. Pensé que era un error en la página de códigos de Windows 65001 que realmente no era compatible con la consola, pero finalmente hice programas de prueba en C y Perl y el problema no ocurre en la versión C. Sucede sin importar dónde aparece el carácter Unicode en la línea, pero la línea que está imprimiendo debe ser más ancha de lo que admite la consola.

Aquí es mi programa 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; 
}

Y aquí es mi programa 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";

ACTUALIZACIÓN

No me he equivocado, con la ayuda de algunos de los chicos en #perl en irc.perl.org resulta ser un error en la API de Microsoft. WriteFile está documentado para devolver el número de bytes escrito pero devuelve el número de caracteres escrito, que depende de la página de códigos. A bug was filed in March 2010.

Hay más discusión in the MSDN forums.

ACTUALIZACIÓN 2

he publicado el blog de Michael Kaplan, "Sorting it all out", sobre este problema y él respondió con el artículo titulado "Hidden in plain site: a purloined letter kind of a bug report". Es un experto en internacionalización de Microsoft por lo que seguramente encontrará algunas ideas allí ...

0

ahora no recibo ningún saltos de línea. ¿Su línea de comando es lo suficientemente amplia como para ajustarse a su salida?

+0

Mi línea de comandos es lo suficientemente amplia pero he notado que el problema no ocurre si configuro la página de códigos en 850 usando 'chcp 850'; sin embargo, los caracteres no se muestran correctamente. Windows Vista 32 bits, Activestate Perl 5.10.0 MSWin32-x86-multi-thread. – RedGrittyBrick

+0

salida de chcp aquí: 932. ¿Intenta eso, quizás? – Hugmeir

+0

@RedGrittyBrick, no veo el problema descrito en Windows Vista de 64 bits, Activestate Perl 5.10.1 MSWin32-x86-multi-thread. Tal vez intente actualizar su instalación de Perl. –