首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自用Perl从JSON1升级到JSON2以来的扰码

自用Perl从JSON1升级到JSON2以来的扰码
EN

Stack Overflow用户
提问于 2013-05-17 15:47:01
回答 4查看 599关注 0票数 1

我想知道为什么我们的页面上出现了一些德国货币。然后,我发现最近版本的JSON (我使用2.07)确实以一种不同于JSON 1.5的方式转换字符串。

这里的问题是,我有一个包含字符串的散列,如

代码语言:javascript
复制
use Data::Dumper;
my $test = {
  'fields' => 'überrascht'
};

print Dumper(to_json($test));给了我

代码语言:javascript
复制
$VAR1 = "{ \"fields\" : \"\x{fc}berrascht\" } "; 

使用旧模块

代码语言:javascript
复制
$json = JSON->new();
print Dumper ($json->to_json($test));

给我(正确的结果)

代码语言:javascript
复制
$VAR1 = '{"fields":[{"title":"überrascht"}]}'; 

因此,使用新的JSON 2模块对umlauts进行加扰。

,我需要什么才能得到正确的答案?

更新:使用数据::显示输出可能是不好的,因为Dumper使用自己的编码。从Dumper的结果来看,任何东西在这里都有不同的处理方式。最好像Brad提到的那样描述后端: json字符串使用Template-Toolkit打印,然后分配给javascript变量以供进一步使用。正确的javascript显示如下所示

代码语言:javascript
复制
{
    "title" : "Geändert",
},

使用我得到的新模块

代码语言:javascript
复制
{
    "title" : "Geändert",
},

目标页面在8859-1 (latin1)中.有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-17 15:55:11

使用encode_json代替。根据手册,它将给定的Perl数据结构转换为UTF-8编码的二进制字符串。

有关您的更新:如果您真的想在Latin1中生成JSON (ISO-8859-1),您可以尝试:

代码语言:javascript
复制
to_json($test, { latin1 => 1 })

代码语言:javascript
复制
JSON->new->latin1->encode($test)

请注意,如果转储结果,在本例中获取\x{fc} for ü是正确的。我猜问题的根源在于您从某个地方接收了Perl的UTF-8格式的文本。在本例中,需要JSON模块的latin1选项。

您还可以尝试使用ascii而不是latin1作为最安全的选项。

另一种解决方案可能是为Template-Toolkit指定输出编码。我不知道这是否可能。或者,在将结果发送到客户端之前,可以在最后一步将结果编码为Latin1。

票数 2
EN

Stack Overflow用户

发布于 2013-05-17 16:37:00

\x{fc}ü,至少在拉丁文-1,拉丁文-9中是这样。另外,ü是Unicode中的码点U+00FC。然而,我们想要UTF-8 (我想)。获得UTF-8字符串文字的最简单的解决方案是使用这种编码保存您的Perl源代码,并将一个use utf8;放在脚本的顶部。

然后,将字符串编码为JSON将得到正确的输出:

代码语言:javascript
复制
use strict; use warnings; use utf8;
use Data::Dumper; use JSON;
print Dumper encode_json {fields => "nicht überrascht"};

encode_json假设UTF-8.阅读文档获得更多信息。

输出:

代码语言:javascript
复制
$VAR1 = '{"fields":"nicht überrascht"}';

(JSON模块版本: 2.53)

票数 5
EN

Stack Overflow用户

发布于 2013-05-17 17:49:16

代码语言:javascript
复制
my $json_text = to_json($data);

是缩写

代码语言:javascript
复制
my $json_text = JSON->new->encode($data);

这将返回Unicode代码点的字符串。U+00FC确实是"ü“的正确Unicode代码点,因此输出是正确的。(作为证据,HTML源代码实际上是"ü"。)

很难判断您的原始输出实际包含了什么(因为您显示了非ASCII字符),因此很难确定您的问题实际上是什么。

但是,在输出字符串之前,必须做的一件事是使用编码encodeencode_utf8将其从代码点字符串转换为字节。

代码语言:javascript
复制
my $json_cp1252 = encode('cp1252', to_json($data));

my $json_utf8 = encode_utf8(to_json($data));

如果适当的编码是UTF-8,您也可以使用以下任何一种编码:

代码语言:javascript
复制
my $json_utf8 = to_json($data, { utf8 => 1 });

my $json_utf8 = encode_json($data);

my $json_utf8 = JSON->new->utf8->encode($data);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16613185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档