Печать символов Юникода из кодов, содержащихся в переменной и из файла - PullRequest
1 голос
/ 19 апреля 2020

Вот некоторый код, который не выполняет то, что я надеюсь, сделать:

#!/usr/bin/perl -w 
use utf8;

binmode STDOUT, ":utf8";

# open a filehandle to a file that contains a single line of text: Hello \x{2744}!
open (H, "<:encoding(UTF-8)", "test.txt") || die $!;
while(<H>) {
    $line = $_;
    chomp($line);
    $var = "Hello \x{2744}!";
    $line = $line . " $var\n";

    print STDOUT "$line";
}

Вывод выглядит следующим образом:

Hello \x{2744}! Hello ❄!

Почему он печатает содержимое переменной, которую я назначаю в сценарии как символ Юникода, но не делает то же самое с текстом, который содержится в файле?

Я предполагаю, что упускаю что-то очевидное - любые указатели приветствуются!

1 Ответ

0 голосов
/ 19 апреля 2020

Строки, прочитанные из файла, имеют символ Unicode шестнадцатеричное представление , но не сам символ (последовательность байтов, представляющая символ).

Строка требует замены символа Unicode шестнадцатеричное представление с самим символом.

Следующий фрагмент кода демонстрирует два способа достижения желаемого результата.

#!/usr/bin/perl
#
# vim: ai:ts=4:sw=4
#

use strict;
use warnings;
use feature 'say';

use Encode;
use utf8;

binmode STDOUT, ":utf8";

my @lines = (
    "Hello \x{2744}!",
    "Hello ❄!"
    );

while(my $line0=<DATA>) {
    chomp $line0;
    my $line1 = $line0;
    $line0 =~ s/\\x\{([\da-z]+)\}/decode('UTF-16',pack('H4',$1))/ieg;
    $line1 =~ s/\\x\{([\da-z]+)\}/chr(hex($1))/ieg;
    push @lines, $line0;
    push @lines, $line1;
}

say for @lines;

__DATA__
Hello \x{2744} you need \x{2602} to go under \x{2600}
Danger \x{2622} doctor Robinson, danger \x{2622}

Вывод

Hello ❄!
Hello ❄!
Hello ❄ you need ☂ to go under ☀
Hello ❄ you need ☂ to go under ☀
Danger ☢ doctor Robintson, danger ☢
Danger ☢ doctor Robintson, danger ☢
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...