【问题标题】:Perl Encode - UK charactersPerl 编码 - 英国字符
【发布时间】:2010-06-15 15:26:03
【问题描述】:

这是来自This Question 的第 2 部分问题。

所以我正在尝试 :encode 功能,但一点运气都没有。

use Encode;
use utf8;

# Should print: iso-8859-15
print "Latin-9 Encoding: ".find_encoding("latin9")->name."\n"; 

my $encUK = encode("iso-8859-15", "UK €");
print "Encoded UK: ".$encUK."\n";

结果:

Encoded UK: UK €

不应该对结果进行编码吗?我在这里做错了什么?

编辑:

添加了建议:

use utf8;

现在我明白了:

Encoded UK: UK �

现在拔掉头发:/

【问题讨论】:

  • 您不需要use utf8; 才能在脚本中嵌入编码字符串吗?
  • 嗯补充说,见上面的编辑
  • print "Latin-9 Encoding: "... 行打印了什么?
  • 您为什么还要尝试生成“Latin-9”输出?为什么不只产生 UTF-8 输出?
  • Latin-9 是业务需求

标签: perl encode latin9


【解决方案1】:

不要拉扯你的头发。你做对了一切,已经完成并且已经得到了预期的数据;输出让您感到困惑,因为您可能从未设置为 Latin-9 而是设置为不同编码(可能是 UTF-8)的终端查看它。

> perl -e'use utf8; use Encode; print encode "Latin-9", "Euro €"'
Euro �

> perl -e'use utf8; use Encode; print encode "Latin-9", "Euro €"' | hex
0000  45 75 72 6f 20 a4                                 Euro .

Codepoint A4 is indeed the Euro symbol in Latin-9.

【讨论】:

  • 感谢使用链接我看到欧元是 \x{20AC} 但一个?仍然出现,但我尝试了其他几个符号,它们工作得很好。 \x{00A3}
  • 您误读了表格。 U+20AC 是 Unicode 中欧元字符的代码点,但你说你想要编码 Latin-9。使用行和列标题。 A 和 4 给出 A4。该表仅用于完整性检查,如果您在任何地方都写了这样的\x 转义码,它就违背了Encode 模块的目的。 ⁓ 您看到替换字符是因为您使用了错误的终端设置。也将其字符编码切换为Latin-9。 ⁓ Perl 中字符编码的最佳解释是p3rl.org/UNI,请阅读所有内容。
【解决方案2】:

我认为您可能没有在脚本中正确编码字符。你的编辑认为它的编码是什么?

例如我只是尝试了这个,以完全规避它:

use Encode;

# Should print: iso-8859-15
print "Latin-9 Encoding: ".find_encoding("latin9")->name."\n";

my $encUK = encode("iso-8859-15", "\xA3");
print "Encoded UK: ", $encUK, "\n";

输出:

拉丁语 9 编码:iso-8859-15 编码英国:£

【讨论】:

  • 你在哪里找到的? \xA3 这不是编码吗?
  • 是的,可以,但我想我的第二个问题是“我需要为英国映射所有字符吗”?我认为 encode() 可以传递字符 £ 并将其编码为 \xA3,这不正确吗?
  • @Phil:我在谷歌上搜索“hex code uk pound symbol”来找到一个十六进制代码图表,因为我找不到安装 vim 的正确编码来正确插入符号我的测试脚本。它应该已经在内部由 \xA3 表示,假设您的编辑器正确编码了字符,但情况可能并非如此。
  • 我使用 VI,它只显示使用字符,但 encode() 不应该转换它吗?
  • @Phil:是的,可能。您可以使用十六进制转储器来确认您在另一端得到了什么。
【解决方案3】:

"使用 utf8;"是,从 Perl 5.8 开始,只用来告诉 Perl 你的源文件是用 UTF-8 编码的。

那么你源代码的编码真的和你告诉 Perl 的一致吗?

使用 'vim' 必须使用此选项以 UTF-8 写入文件:

:set fenc=utf8

要在加载文件时返回 UTF-8,必须在 .vimrc 中定义文件编码:

set fileencodings=ucs-bom,utf-8,latin9

【讨论】:

    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多