Как напечатать все символы CP1252 по одному? - PullRequest
1 голос
/ 03 июня 2010

Я не могу написать скрипт для печати всех символов Latin-1 по одному. Как я могу это сделать?

Я использую приведенный ниже код, но он не дает ожидаемого результата.

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

Вывод должен быть таким:

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

Для всех кодовых точек после 007F он не дает ожидаемых результатов.

Ответы [ 3 ]

4 голосов
/ 04 июня 2010

В заголовке вашего вопроса сказано, что вы хотите "CP1252", но затем в тексте своего вопроса вы говорите, что хотите "Latin-1". CP1252 и Latin-1 - это не одно и то же. CP1252 - это кодировка Microsoft, основанная на Latin-1, но с некоторыми символами, которые Microsoft сочла бесполезными, заменены другими символами.

Например, в CP1252 байт 0x93 представляет собой двойную левую кавычку («), но в Latin-1 это непечатный управляющий код.

Внутренняя кодировка Perl (почти, но не совсем) UTF-8. Вы можете взять байт CP1252 и преобразовать его в формат строки символов Perl UTF-8, например:

use Encode qw(decode);

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

Символ 0x80 в CP1252 является символом евро. В Unicode символом евро является U + 20AC. Так что теперь $ char будет установлен в "\ x {20AC}".

Ваша следующая проблема - вы хотите «распечатать» символы. Это может означать много вещей. Проблема в том, что вам нужно преобразовать внутреннее символьное представление Perl во все, что ожидает ваше устройство вывода.

Например, мое окно терминала Linux с удовольствием отображает UTF-8, поэтому я бы сделал следующее, чтобы распечатать символ евро:

binmode(STDOUT, ':utf8');

print $char, "\n";

Это вряд ли будет работать в командной строке Windows, хотя.

Если вы генерируете вывод HTML, вы должны выписать UTF-8 и убедиться, что у вас есть соответствующий заголовок для объявления кодировки. Это будет работать практически с любым браузером, выпущенным за последние 10-15 лет.

2 голосов
/ 03 июня 2010
foreach (0..255) {
    $hexval = sprintf("%x",$_);
    $charval = sprintf("%c",$_);
    print "$_ => $hexval -> $charval\n";
}
0 голосов
/ 03 июня 2010

use strict дал бы вам хорошее представление о причине. В строке 3 вашего примера у вас есть

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

Однако вы не устанавливаете значение для %hexval, вы, вероятно, можете $hexval. Это вторая ошибка, вы хотите отформатировать исходное значение $char, а не отформатированное шестнадцатеричное значение.

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

Это делает вашу вторую строку ненужной, и код можно упростить до

use strict;
for my $char (0..255) {
    printf "%c\n", $char;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...