我有一个 CMS 和一个使用旧的 perl JSON 模块(版本 1.54)的服务器。我需要将带有字符串的哈希/对象编码为 latin-1(目标页面是 8859-1 编码的)。
如何才能做到这一点?
到目前为止我的代码:
use JSON;
my $json = JSON->new();
$json->to_json($str),
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;
我认为您的意思是将 perl 数据结构编码为 JSON,或者将字符串(采用 JSON 格式)解码为 perl 数据结构。
但就将字符串编码为 latin-1 而言,您是否尝试过Encode?