在perl中使用API​​粘贴UTF-8

sma*_*ape 4 perl

有点新Perl.我使用Perl Web API来获取数据.错误是"application/xml; charset = UTF-8".我使用'use utf8'但似乎不起作用.它被卡住的线看起来像这样

my @candidates = $c->bookmarks_for(start => 1, tag =>'pubmed');
Run Code Online (Sandbox Code Playgroud)

你能帮我么.

谢谢Sammed

jm6*_*666 11

该

use utf8;
Run Code Online (Sandbox Code Playgroud)

只有(也是唯一的)一件事.当您在源代码中使用utf8字符时.例如:

my $utf8str = "??";
Run Code Online (Sandbox Code Playgroud)

对于任何其他的,例如:

my $data = MyModule::get_some_data();
Run Code Online (Sandbox Code Playgroud)

你应该使用

my $utf8data = Encode::decode_utf8($data);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当你的get_some_data返回八位字节(字节)时.

例如,在读取文本文件时,您可以在IO级别告诉perl utf8转换,

open($fd, "<", $filename);
$fd->binmode(:utf8); #for marking data as utf8, or
$fd->binmode(:encoding(utf8)); #for marking *and* checking data for utf8 validity too.
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用open pragma在IO层使用utf8作为默认值来告诉perl

use open(:std :utf8);
Run Code Online (Sandbox Code Playgroud)

这里没有简短的回答.你真的应该阅读:

Perl在utf8处理方面非常强大,但你必须知道,热门才能正确使用它 - 不幸的是,这不是RTFM的简短方法......

注意:这里有perl <5.6,5.6,5.8,5.12,5.14的utf8处理的差异......

  • @Sherm Pendley:不.很多很多perl程序都使用字符串来表示任意二进制数据.这与你想要的完全不一致. (5认同)
  • +1很棒的答案.虽然这让我感到困惑,但是在2011年我们仍然会**跳过这些篮球.最近的Perl版本应该将UTF8作为默认值,并且当需要支持其他内容时需要完成此类操作. (4认同)
  • @汤姆 - 我不指望一个神奇的子弹.拥有旧的行为是好的,**作为一种选择**.我认为荒谬的是旧的行为仍然是默认的.它是2011年 - Unicode应该是默认值,并且应该有一个PERL_NO_UNICODE环境变量可用于仍然无法处理它的脚本. (4认同)
  • @Sherm,你是天真的:没有灵丹妙药.如果您认为这是一个好主意,只需将您的`PERL_UNICODE`变量设置为`SAD`,看看有什么中断. (3认同)