【发布时间】:2015-06-07 04:54:59
【问题描述】:
我已经在 Mac OS Mavericks (perl 5.16.2) 和 Yosemite 以及 Windows 7 (strawberry-perl-5.20.1.1-64bit-portable) 上尝试了我的脚本。
它应该读取 UTF-8 数据(俄语文本)并将其放入数据结构中 - 最后将数据结构打印为 JSON 字符串(输出将用于在 iOS 文字游戏中提供 Core Data)。
第一部分有效(提取单词并打印它们 - 进行验证)效果很好,但最后部分无效:生成的 JSON 字符串包含垃圾:
有人知道如何修复我的简单测试脚本吗?
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use JSON;
binmode(STDOUT, ':utf8');
my $root = { words => [] };
while (<DATA>) {
chomp;
utf8::decode($_);
my @a = split /\s*[:,]\s*/;
my $words = [];
for my $word (@a[1 .. $#a]) {
print "WORD: $word\n";
#push @$words, utf8::encode($word);
push @$words, $word;
}
push @{$root->{words}}, $words;
}
print to_json($root, {utf8 => 1, pretty => 1});
__DATA__
Голова: небо, язык, мозг, глотка, надгортанник, пищевод, горло, гортань
Сумки: портмоне, кошелек, портфель, рюкзак, лямка, застежка
【问题讨论】:
-
PS -
utf8::decode($_);不应该在那里,因为use utf8;已经解码了源代码(包括数据)。它目前正在失败(默默地),但它可能会破坏您的数据。 -
实际上在我的真实脚本中我没有阅读
<DATA>,而是使用while (<>)阅读另一个文件,这就是为什么我添加了utf8::decode($_)以便正则表达式在读取的行上工作。 -
使用
use open ':std', ':encoding(UTF-8)';。它对 STDIN 进行解码,对 STDOUT 和 STDERR 进行编码,并为在其词法范围内打开的文件设置默认编码。这包括使用<>打开的那些。