【发布时间】:2018-06-02 06:41:01
【问题描述】:
我正在使用一些需要 latin1 字符串数据的 XS 模块(并忽略 perl 的 UTF8 标志)。在某些情况下,我会传递 JSON 解码的结果,它应该只包含 latin1 字符,但在某些情况下会转义它们(例如["co\u00f6perative"])。
是否有提供返回降级字符串选项的 JSON 解码模块(至少在可能的情况下)?我在 JSON、JSON::XS 或 Cpanel::JSON::XS 中找不到这样的选项。
use strict;
use warnings;
use Cpanel::JSON::XS;
use Devel::Peek;
my $got = Cpanel::JSON::XS->new->decode('["co\u00f6perative"]')->[0];
Dump $got;
my $wanted = $got;
utf8::downgrade($wanted);
Dump $wanted;
输出:
SV = PV(0xd6cbf0) at 0xd8a460
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK,UTF8)
PV = 0xd83b40 "co\303\266perative"\0 [UTF8 "co\x{f6}perative"]
CUR = 12
LEN = 14
COW_REFCNT = 0
SV = PV(0xd6cb20) at 0xd977f0
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0xe0d120 "co\366perative"\0
CUR = 11
LEN = 14
【问题讨论】:
-
可能不会。您是否反对仅遍历数据结构并重新编码字符串?
-
@Borodin 恐怕我最终会这样做;只是询问是否有人在我还没有找到的某个 json 模块中解决了这个问题
-
如果有一个 JSON 解析器在不同的语法点提供钩子就好了。不乏能做到这一点的 XML 解析器,甚至
File::Find也有类似的功能。也许我会写点什么。