【问题标题】:Printing unicode characters from codes contained in variable and from file从变量中包含的代码和文件中打印 unicode 字符
【发布时间】:2020-08-01 23:22:06
【问题描述】:

这里有一些代码没有做我希望它做的事情:

#!/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 ❄!

为什么它将我在脚本中分配的变量的内容打印为 unicode 字符,但对文件中包含的文本却不这样做?

我想我遗漏了一些明显的东西 - 欢迎任何指针!

【问题讨论】:

  • 看起来是正确的。您是否期望对文件中的反斜杠序列进行评估?
  • 但这不是我想看到的。我想让 $line 的值也被“翻译”成 unicode 字符...
  • $line 和 $var 的初始值相同。为什么它们组合后的打印效果不同?

标签: perl utf-8


【解决方案1】:

从文件中读取的行具有 Unicode 字符十六进制表示,但没有字符本身(表示字符的字节序列)。

该行要求用字符本身替换 Unicode 字符十六进制表示

以下代码 sn-p 演示了两种实现所需输出的方法。

#!/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 ☢

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2016-08-29
    • 2015-03-05
    • 1970-01-01
    • 2012-11-21
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多