【问题标题】:What string should be used to specify encoding in Perl POD, "utf8", "UTF-8" or "utf-8"?应该使用什么字符串来指定 Perl POD 中的编码,“utf8”、“UTF-8”或“utf-8”?
【发布时间】:2013-08-09 04:04:53
【问题描述】:

可以用 UTF-8 编写 Perl 文档。为此,您应该在您的 POD 中写入:

=encoding NNN

但是你应该写什么呢NNN?不同的来源给出不同的答案。

正确答案是什么?在 POD 中正确写入的字符串是什么?

【问题讨论】:

  • 从技术上讲,这些都不是。 Unicode 和 UTF-8 是不同的编码。
  • 更迂腐的是,unicode 是一种解码,而不是一种编码。
  • 谢谢 =) 你是对的。我将从问题中删除术语 Unicode。

标签: perl encoding utf-8 documentation


【解决方案1】:
=encoding UTF-8

According to IANA, charset names are case-insensitive,所以utf-8 是一样的。

utf8 is Perl's lax variant of UTF-8. 但是,为了安全起见,您希望对您的 POD 处理器严格。

【讨论】:

  • 谢谢。这是我想要得到的答案 =) 还有一件事。所以perlpod 和它的=encoding utf8 是不正确的。你认为值得提出补丁吗?
  • 这不是什么大事。做你想做的事。
【解决方案2】:

正如 daxim 指出的那样,我被误导了。 =encoding=UTF-8=encoding=utf-8 应用严格编码,=encoding=utf8 是宽松编码:

$ cat enc-test.pod
=encoding ENCNAME

=head1 TEST '\344\273\245\376\202\200\200\200\200\200'

=cut

(这里\xxx 表示值为xxx 的文字字节。\344\273\245 是有效的 UTF-8 序列,\376\202\200\200\200\200\200 不是)

=encoding=utf-8:

$ perl -pe 's/ENCNAME/utf-8/' enc-test.pod | pod2cpanhtml | grep /h1
>TEST &#39;&#20197;&#27492;&#65533;&#39;</a></h1>

=encoding=utf8:

$ perl -pe 's/ENCNAME/utf8/' enc-test.pod | pod2cpanhtml | grep /h1
Code point 0x80000000 is not Unicode, no properties match it; ...
Code point 0x80000000 is not Unicode, no properties match it; ...
Code point 0x80000000 is not Unicode, no properties match it; ...
>TEST &#39;&#20197;&#2147483648;&#39;</a></h1>

它们都是等价的。 =encoding 的参数应该是 Encode::Supported 模块识别的名称。当您深入查看该文档时,您会看到

  • 规范编码名称为utf8
  • 名称UTF-8utf8 的别名,并且
  • 名称不区分大小写,因此utf-8 等价于UTF-8

最佳做法是什么?我不知道。我认为使用官方 IANA 名称不会出错(根据 daxim 的回答),但是按照官方 Perl 文档,你也不会出错。

【讨论】:

  • 文档中的别名部分会误导您,连字符和无连字符的处理方式不同。试试:perl -MEncode=decode -MDevel::Peek=Dump -e'Dump decode "utf-8", "\xfe\x82\x80\x80\x80\x80\x80", Encode::FB_CROAK | Encode::LEAVE_SRC'
  • 哇!感谢您为展示 utf8 和 utf-8 之间的区别所做的出色工作。
猜你喜欢
  • 2013-06-17
  • 2020-11-29
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多