我正在 perl 中处理来自 XML 文件的一些数据,并想使用 FIFO File::Queue 来划分和加速该过程。一个 perl 脚本解析 XML 文件并为另一个脚本准备 JSON 输出:
#!/usr/bin/perl -w
binmode STDOUT, ":utf8";
use utf8;
use strict;
use XML::Rules;
use JSON;
use File::Queue;
#do the XML magic: %data contains result
my $q = new File::Queue (File => './importqueue', Mode => 0666);
my $json = new JSON;
my $qItem = $json->allow_nonref->encode(\%data);
$q->enq($qItem);
只要%data
包含数字和 az 数据,就可以正常工作。但是当出现其中一个宽字符时(例如 ł、ą、ś、ż 等),我得到:Wide character in syswrite at /usr/lib/perl/5.10/IO/Handle.pm line 207.
我试图检查字符串是否为有效的 utf8:
print utf8::is_utf8($qItem). ':' . utf8::valid($qItem)
我确实得到了1:1
- 所以是的,我确实有正确的 utf8 字符串。
我发现原因可能是 syswrite 将文件处理程序获取到不知道是 :utf8 编码文件的队列文件。
我对吗?如果是这样,有什么方法可以强制 File:Queue 使用 :utf8 文件处理程序?也许 File:Queue 不是最好的选择——我应该使用其他方法在两个 perl 脚本之间创建 FIFO 队列吗?