我想知道为什么我们的页面上出现了一些德国货币。然后,我发现最近版本的JSON (我使用2.07)确实以一种不同于JSON 1.5的方式转换字符串。
这里的问题是,我有一个包含字符串的散列,如
use Data::Dumper;
my $test = {
'fields' => 'überrascht'
};print Dumper(to_json($test));给了我
$VAR1 = "{ \"fields\" : \"\x{fc}berrascht\" } "; 使用旧模块
$json = JSON->new();
print Dumper ($json->to_json($test));给我(正确的结果)
$VAR1 = '{"fields":[{"title":"überrascht"}]}'; 因此,使用新的JSON 2模块对umlauts进行加扰。
,我需要什么才能得到正确的答案?
更新:使用数据::显示输出可能是不好的,因为Dumper使用自己的编码。从Dumper的结果来看,任何东西在这里都有不同的处理方式。最好像Brad提到的那样描述后端: json字符串使用Template-Toolkit打印,然后分配给javascript变量以供进一步使用。正确的javascript显示如下所示
{
"title" : "Geändert",
},使用我得到的新模块
{
"title" : "Geändert",
},目标页面在8859-1 (latin1)中.有什么建议吗?
发布于 2013-05-17 15:55:11
使用encode_json代替。根据手册,它将给定的Perl数据结构转换为UTF-8编码的二进制字符串。
有关您的更新:如果您真的想在Latin1中生成JSON (ISO-8859-1),您可以尝试:
to_json($test, { latin1 => 1 })或
JSON->new->latin1->encode($test)请注意,如果转储结果,在本例中获取\x{fc} for ü是正确的。我猜问题的根源在于您从某个地方接收了Perl的UTF-8格式的文本。在本例中,需要JSON模块的latin1选项。
您还可以尝试使用ascii而不是latin1作为最安全的选项。
另一种解决方案可能是为Template-Toolkit指定输出编码。我不知道这是否可能。或者,在将结果发送到客户端之前,可以在最后一步将结果编码为Latin1。
发布于 2013-05-17 16:37:00
\x{fc}是ü,至少在拉丁文-1,拉丁文-9中是这样。另外,ü是Unicode中的码点U+00FC。然而,我们想要UTF-8 (我想)。获得UTF-8字符串文字的最简单的解决方案是使用这种编码保存您的Perl源代码,并将一个use utf8;放在脚本的顶部。
然后,将字符串编码为JSON将得到正确的输出:
use strict; use warnings; use utf8;
use Data::Dumper; use JSON;
print Dumper encode_json {fields => "nicht überrascht"};encode_json假设UTF-8.阅读文档获得更多信息。
输出:
$VAR1 = '{"fields":"nicht überrascht"}';(JSON模块版本: 2.53)
发布于 2013-05-17 17:49:16
my $json_text = to_json($data);是缩写
my $json_text = JSON->new->encode($data);这将返回Unicode代码点的字符串。U+00FC确实是"ü“的正确Unicode代码点,因此输出是正确的。(作为证据,HTML源代码实际上是"ü"。)
很难判断您的原始输出实际包含了什么(因为您显示了非ASCII字符),因此很难确定您的问题实际上是什么。
但是,在输出字符串之前,必须做的一件事是使用编码的encode或encode_utf8将其从代码点字符串转换为字节。
my $json_cp1252 = encode('cp1252', to_json($data));
my $json_utf8 = encode_utf8(to_json($data));如果适当的编码是UTF-8,您也可以使用以下任何一种编码:
my $json_utf8 = to_json($data, { utf8 => 1 });
my $json_utf8 = encode_json($data);
my $json_utf8 = JSON->new->utf8->encode($data);https://stackoverflow.com/questions/16613185
复制相似问题