1

我有一个 CMS 和一个使用旧的 perl JSON 模块(版本 1.54)的服务器。我需要将带有字符串的哈希/对象编码为 latin-1(目标页面是 8859-1 编码的)。

如何才能做到这一点?

到目前为止我的代码:

use JSON;

my $json = JSON->new();
$json->to_json($str),
4

2 回答 2

2

JSON 2.x模块具有$json->ascii$json->latin1方法,它们告诉模块分别用等效的转义序列替换 ASCII 和 ISO-8859-1 字符集之外的字符\uNNNN

不幸的是,JSON 模块的 1.x 版本显然(感谢 Quentin!)没有这些方法。但是,鉴于非 ASCII 字符不应出现在有效 JSON 中字符串之外的任何位置,因此应该可以在编码步骤之后将它们转义,如下所示:

use JSON;
my $output = to_json( $data );

# encode non-ASCII characters as \uNNNN escapes:
$output =~ s/([^\x20-\x7e])/sprintf "\\u%04x", ord $1/eg;

请注意,上述替换不适用于基本多语言平面之外的字符(即代码点高于 U+FFFF)。为了处理这些,我们需要使用代理对,这可能最好在单独的通道中处理:

# encode non-BMP characters as surrogate pairs:
$output =~ s{([^\0-\x{FFFF}])}{
    my $c = ord($1) - 0x10000;
    pack "W2", ($c >> 10) + 0xD800, ($c & 1023) + 0xDC00;
}eg;

# encode non-ASCII characters as \uNNNN escapes:
$output =~ s/([^\x20-\x7e])/sprintf "\\u%04x", ord $1/eg;
于 2013-05-22T16:35:52.010 回答
1

我认为您的意思是将 perl 数据结构编码为 JSON,或者将字符串(采用 JSON 格式)解码为 perl 数据结构。

但就将字符串编码为 latin-1 而言,您是否尝试过Encode

于 2013-05-22T12:51:38.390 回答