Как я могу отображать символы расширенных кодов ASCII в Perl?

альтернативный текст

Как отобразить символ 192 символа ( └) в Perl?

5 ответов

Решение

То, что вы хотите, чтобы иметь возможность печатать Unicode, и ответ в perldoc perluniintro,

Ты можешь использовать \x{nnnn} где n - шестнадцатеричный идентификатор, или вы можете сделать \N{...} с именем:

perl -E 'say "\x{2514}"; use charnames; say "\N{BOX DRAWINGS LIGHT UP AND RIGHT}"'

Чтобы использовать именно эти коды, ваш терминал должен поддерживать кодовую страницу 437, которая содержит фреймы. В качестве альтернативы вы можете использовать производную CP850 с меньшим количеством символов бокса. Такие символы бокса также существуют как блочные элементы Unicode. Символ, который вы хотите в Perl, отмечен как \N{U+2514}, Больше подробностей в perlunicode

Это похоже на кодировку 437 кодировки. Perl, вероятно, просто выводит байты, которые вы ему даете. И ваш терминал, вероятно, ожидает UTF8.

Поэтому вам нужно декодировать его в Unicode, а затем перекодировать в UTF-8.

РЕДАКТИРОВАТЬ: правильное кодирование.

Как обычно, Джон Скит прибивает это: 192 код находится в расширенном диапазоне ASCII. Я предлагаю вам последовать совету @Douglas Leeder, но я не уверен, какую кодировку дает вам www.LookupTables.com; ISO-8859-1 думает, что 192 отображается на "А", и Mac OS Roman думает, что это "¿".

Есть ли решение, которое работает на ВСЕХ персонажах?

Пользователь говорит, что хотел использовать символ расширенной кодировки latin-1 — так что давайте попробуем пример из этого блока! Так что, если бы им нужен был персонаж, они бы сбежали...

      print "\x{00C6}";

Выход:

Полное тестирование, онлайн-демонстрация

Режимы кодирования символов TDLR в Perl

Итак, подождите, что там только что произошло? Вы заметите, что другие способы вызова UTF-8, такие как char(...), \N{U+...}, и даже unpack(...)также есть такая же проблема. Правильно — проблема не в какой-либо из этих функций, а в базовом уровне абстракции символов. В этом случае вы захотите указать этот слой в начале своего кода.

      use open qw( :std :encoding(UTF-8) );
print "\x{00C6}";

Выход: Æ

Теперь я могу правильно написать "Эльф" !

Полное тестирование, онлайн-демонстрация

Почему это произошло?

В PerlDoc есть примечание относительно chr()функция ....

Обратите внимание, что символы от 128 до 255 (включительно) по умолчанию не кодируются внутри как UTF-8 из соображений обратной совместимости.

По этой причине этот специальный блок должен иметь этот специальный use openчтобы указать стандартную кодировку.

Другие вопросы по тегам