为什么使用非拉丁字母语言环境的Encode :: decode会在本地化的strftime输出上爆炸?

问题描述 投票:2回答:1

在Ubuntu上使用Perl 5.26.1我在使用Dancer :: Logger :: Console时遇到了以下问题。我已经从Dancer2::Core::Role::Logger中取出了这个代码。

要运行此命令,您需要生成以下语言环境:

sudo locale-gen de_DE.UTF-8
sudo locale-gen ko_KR.UTF-8

此示例代码使用朝鲜语语言环境,并在没有错误消息的情况下失败。 $@是空的。

$ LC_ALL=ko_KR.UTF-8 perl -MPOSIX -MEncode -E 'eval {
    say Encode::decode("UTF-8", strftime("%b", localtime))
  }; 
  say $@;
  '
Wide character at -e line 1.

当使用德语语言环境运行时,它会成功(但会抛出一个宽字符警告,我们可以忽略此测试)。

$ LC_ALL=de_DE.UTF-8 perl -MPOSIX -MEncode -E 'eval {
    say Encode::decode("UTF-8", strftime("%b", localtime))
  }; 
  say $@;
  '
Wide character in say at -e line 2.
M�r

%b格式是缩写的月份为本地化的单词(请参阅http://strftime.net/)。

如果我们不Encode::decode("UTF-8", ...),它的工作原理,上面的版本与韩国产生3월

这里发生了什么?

perl utf-8 locale
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.