【问题标题】:How to use utf8 encode with open pragma如何使用带有 open pragma 的 utf8 编码
【发布时间】:2013-05-05 05:52:24
【问题描述】:

我在使用编译指示 use open qw(:std :utf8); 时遇到了 utf8::encode 的问题

示例

#!/usr/bin/env perl

use v5.16;
use utf8;
use open qw(:std :utf8);

use Data::Dumper;

my $word = "+банк";
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

utf8::encode($word);
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;

输出

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0

当我删除这个 pragma use open qw(:std :utf8); 时,一切正常。

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0

谢谢你!

【问题讨论】:

  • 使用:std :utf8 将UTF-8 层添加到STDOUT。因此最后一个say 将尝试再次编码$word..

标签: perl utf-8 character-encoding


【解决方案1】:

如果您要将utf8::encode($word); 替换为use open qw(:std :utf8);,您实际上需要删除utf8::encode($word);。在不起作用的版本中,您要编码两次。

【讨论】:

    【解决方案2】:

    utf8::encode 不是如果您要打印到 perl 期望输出 utf8 的文件句柄,您想要的。

    utf8::encode 说取这个字符串并给我一个字符串,其中每个字符都是输入字符串的 utf8 编码的一个字节。这通常只有在您打算以某种方式使用该字符串时才会这样做,如果需要,perl 不会自动转换为 utf8。

    如果你在编码后加上say length($word);,你会看到$word是9个字符,而不是原来的5个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2011-11-05
      • 1970-01-01
      相关资源
      最近更新 更多