2010-06-03 7 views
1

Je ne suis pas capable d'écrire un script pour imprimer tous les caractères Latin-1 un par un. Comment puis-je le faire? J'utilise le code ci-dessous, mais il ne me donne pas le résultat escompté.Comment imprimer tous les caractères CP1252 en un?

foreach $char(0..255) { 
    $hexval = sprintf("%x",$char); 
    $charval = sprintf("%c",%hexval); 
    print "$charval"; 
} 

sortie devrait être comme:

0065 - e 
0066 - f 
... 
... 
007F - character at the step 

Pour tous les points de code après 007F, il ne me donne pas les résultats escomptés.

Répondre

2
foreach (0..255) { 
    $hexval = sprintf("%x",$_); 
    $charval = sprintf("%c",$_); 
    print "$_ => $hexval -> $charval\n"; 
} 
0

use strict aurait donné une bonne idée de la cause. Sur la ligne 3 de votre exemple, vous avez

$charval = sprintf("%c",%hexval); 

Cependant, vous ne définissez pas de valeur pour %hexval, vous MENT probablement $hexval. C'est le deuxième bug, vous voulez formater la valeur originale $char pas la valeur hexadécimale formatée.

$charval = sprintf("%c", $char); 

Cela rend votre deuxième ligne unnessisary et le code peut être simplifié à

use strict; 
for my $char (0..255) { 
    printf "%c\n", $char; 
} 
4

Votre titre de la question dit que vous voulez « CP1252 » mais dans le corps de votre question, vous dites que vous voulez « Latin -1". CP1252 et Latin-1 ne sont pas la même chose. CP1252 est un encodage Microsoft basé sur Latin-1 mais avec certains des caractères que Microsoft a jugé inutiles remplacés par d'autres caractères.

Par exemple dans CP1252, l'octet 0x93 est un guillemet double gauche (") mais en latin-1 c'est un code de contrôle non imprimable.

Le codage interne de Perl est (presque mais pas tout à fait) UTF-8. Vous pouvez prendre un octet CP1252 et de le convertir en format de chaîne de caractères UTF-8 Perl comme ceci:

use Encode qw(decode); 

my $char = decode("CP1252", "\x80"); 

caractère 0x80 CP1252 est le symbole de l'euro. En Unicode, le symbole de l'euro est U + 20AC. Donc $ $ sera défini sur "\ x {20AC}".

Votre prochain problème est que vous voulez "imprimer" les caractères. Cela pourrait signifier beaucoup de choses. Le problème est que vous devez convertir à partir de la représentation des caractères internes de Perl l'encodage attendu par votre périphérique de sortie.

Par exemple ma fenêtre de terminal Linux est heureux d'afficher UTF-8 donc je ferais ce qui suit pour imprimer le caractère Euro:

binmode(STDOUT, ':utf8'); 

print $char, "\n"; 

peu susceptible de travailler à une invite de commande Windows bien.

Si vous générez une sortie HTML, vous devez écrire UTF-8 et vous assurer que vous avez un en-tête approprié pour déclarer le codage. Cela fonctionnera avec à peu près n'importe quel navigateur publié au cours des 10-15 dernières années.

Questions connexes