gpt4 book ai didi

perl - 确保我对 utf8 的处理是正确的

转载 作者:行者123 更新时间:2023-12-01 06:50:44 25 4
gpt4 key购买 nike

我将 Perl 用于涉及处理大量 Unicode 文档的模块。我开始变得紧张,因为我没有打开和关闭像 open (OUT, '>:utf8', $textfile) 这样的 utf8 层的文件。 .然而,我已经彻底测试并且输出仍然符合预期。所以我想更好地理解原因。

简而言之,我的 Perl 模块将文档传递给外部服务并获得响应。响应将采用 Utf8。它为此使用 LWP::UserAgent。当它得到响应时,它只是将它写入一个文件:

my $fh;
open($fh, '>', $outputpath) or die "Could not open file '$outputpath' $!";
print $fh $response->content;
close $fh;

我已经将这些文件与代表“预期”输出的 Unicode 文件进行了比较,结果没问题。然而,您可以在我的打开命令中看到我没有使用 utf8 层。那这是为什么?

如果我只是将 $response->content 返回给其他进程,而不是打印它会怎样?那么它仍然是正确的 Unicode 吗?


我也想问一个单独的过程,非常相似的问题。在这种情况下,我正在尝试构建一项新服务来取代旧服务。旧的从一个文件中读取,如 open(my $fh, '<:utf8', $inputfile)并写入一个新文件,如 open(my $fh, '>:utf8', $outputfile) .新服务仍将以相同方式读取,但不会再写入输出文件。它会使用 HTTP 将字符串发送到另一台服务器,并在该服务器上使用 open(my $fh, '>', $outputfile) 将其打印到文件中。所以没有utf8层。我无法立即更改该代码。

我希望文件内容与原本的内容完全相同(其他处理规则均未更改)。我应该为失去图层感到紧张吗?

我认为如果我更好地理解这些层的作用可能会有所帮助。

最佳答案

主要问题中没有“处理 utf8”,这本身就是不对的。

一切正常,因为服务器正在按您所说的方式发送 utf8,方式如下。

$response 上使用的content 方法来自HTTP::Message

The content() method sets the raw content if an argument is given. If no argument is given the content is not touched. In either case the original raw content is returned.

由于您没有在 open 中指定图层使用默认值,对于 Unix 可能是 :unix:perlio,没有编码(参见 PerlIO )。所以你将原始字节转储到磁盘,没有改变。

进一步向下看页面,在 decoded_content( %options),我们看到默认值

default_charset

This override the default charset guessed by content_charset() or if that fails "ISO-8859-1".

并且可以通过打印来确定你得到了什么

say 'Content type: ', $response->content_charset;

您应该从哪里获得Content type: UTF-8。但是,当您从服务器收到不同的编码时,那个 将出现在文件中,并且任何需要 utf8 的代码都会中断。

人们应该始终解码所有输入并编码所有输出。然后我们确切地知道发生了什么。当输入被解码时,程序继续处理字符串(不是发送的任何编码中的字节)。最后编码适合输出。这Effective Perler article应该有用。在这里,您将使用 decoded_content 并写入使用 :encoding(UTF-8) 打开的文件。

使用 use open ":std", ":encoding(UTF-8)"; 在这个 pragma 的词法范围内通过标准流的所有 I/O 都将作为 utf8 处理。 (这可以被其他特定用途覆盖,比如通过在三个参数 open 中指定层。)参见 open pragma .

至于另一个问题,您需要正确编码您打算“发送到另一台服务器”的内容。如何做到这一点取决于您“发送”它的方式。


PerlIO可以设置 I/O“层”,以便在读取或写入数据时根据需要在幕后完成输入和输出的编码。这项工作由 Encode 完成.有关该过程的详细解释,请参阅 Encode::PerlIO .另见 perlunitut , perlunifaq , 和 perluniitro .

关于perl - 确保我对 utf8 的处理是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48895344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com