Как я могу отображать символы расширенных кодов 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
чтобы указать стандартную кодировку.