脚本可以很好地提取和打印 UTF-8 单词,但将 JSON 打印为垃圾

Script extracts and prints UTF-8 words well, but prints JSON as garbage

我已经在 Mac OS Mavericks (perl 5.16.2) 和 Yosemite 以及 Windows 7 (strawberry-perl-5.20. 1.1-64 位便携式)。

它应该读取 UTF-8 数据(俄语文本)并将其放入数据结构中 - 最后将数据结构打印为 JSON 字符串(输出将用于将核心数据输入iOS 文字游戏)。

第一部分有效(提取单词并打印它们 - 以验证)有效,但最后部分无效:生成的 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__
Голова: небо, язык, мозг, глотка, надгортанник, пищевод, горло, гортань
Сумки: портмоне, кошелек, портфель, рюкзак, лямка, застежка

输出看起来 "wrong",但没关系:它已编码。要正确查看,只需设置

binmode STDOUT, ':raw';

在打印 JSON 之前。

您可以使用 encode_json 来简化脚本:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use JSON;

binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");

my $root;

while (<DATA>) {
        chomp;
        my @words = split /\s*[:,]\s*/;
        push @{ $root->{words} }, [];

        for my $word (@words[1 .. $#words]) {
                print "WORD: $word\n";
                push @{ $root->{words}[-1] }, $word;
        }
}

my $json = encode_json($root);
binmode STDOUT, ':raw';
print $json;

你是双重编码。您正在使用 from_json (utf8 => 1) 进行编码,然后在输出到 STDOUT (binmode(STDOUT, ':utf8');).

时再次进行编码

解决方案不明确,因为不清楚您要实现的目标。如果你真的要输出非JSON和JSON到STDOUT,不要要求from_json编码。