自从在Perl中从JSON1升级到JSON2后,混乱的变音符号

Tha*_*ama 1 perl json

我想知道为什么有些德国变形金刚在我们的页面上乱成一团.然后我发现最新版本的JSON(我使用2.07)确实以不同于JSON 1.5的方式转换字符串.

这里的问题是我有一个像字符串一样的哈希

use Data::Dumper;
my $test = {
  'fields' => 'überrascht'
};
Run Code Online (Sandbox Code Playgroud)

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

$VAR1 = "{ \"fields\" : \"\x{fc}berrascht\" } "; 
Run Code Online (Sandbox Code Playgroud)

使用旧模块

$json = JSON->new();
print Dumper ($json->to_json($test));
Run Code Online (Sandbox Code Playgroud)

给我(正确的结果)

$VAR1 = '{"fields":[{"title":"überrascht"}]}'; 
Run Code Online (Sandbox Code Playgroud)

所以变音符号使用新的JSON 2模块进行了混乱.

我需要什么才能使它们正确?

更新:使用Data :: Dumper显示输出可能不好,因为Dumper使用自己的编码.好吧,Dumper的结果差异表明在这里对待任何事情都是不同的.如Brad提到的那样描述后端可能更好:使用Template-Toolkit打印json字符串,然后将其分配给javascript变量以供进一步使用.正确的javascript显示这样的东西

{
    "title" : "Geändert",
},
Run Code Online (Sandbox Code Playgroud)

使用我得到的新模块

{
    "title" : "Geändert",
},
Run Code Online (Sandbox Code Playgroud)

目标页面位于8859-1(latin1).有什么建议?

amo*_*mon 5

\x{fc}是ü,至少在Latin-1,Latin-9等.此外,ü是U+00FCUnicode中的代码点.但是,我们想要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"};
Run Code Online (Sandbox Code Playgroud)

该encode_json假设UTF-8.阅读文档以获取更多信息.

输出:

$VAR1 = '{"fields":"nicht überrascht"}';
Run Code Online (Sandbox Code Playgroud)

(JSON模块版本:2.53)

  • @ikegami 我意识到了这一点,因此“用这种编码 [UTF-8] 保存你的 Perl 源代码”。使用 UTF8 源代码只是解决问题的一种简单方法,还有其他方法可以实现。 (2认同)

ike*_*ami 5

my $json_text = to_json($data);
Run Code Online (Sandbox Code Playgroud)

是的缩写

my $json_text = JSON->new->encode($data);
Run Code Online (Sandbox Code Playgroud)

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

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

但有一点必须outputing字符串之前要做的就是把它从代码点的字符串转换为字节,说,通过使用编码的encode或encode_utf8.

my $json_cp1252 = encode('cp1252', to_json($data));

my $json_utf8 = encode_utf8(to_json($data));
Run Code Online (Sandbox Code Playgroud)

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

my $json_utf8 = to_json($data, { utf8 => 1 });

my $json_utf8 = encode_json($data);

my $json_utf8 = JSON->new->utf8->encode($data);
Run Code Online (Sandbox Code Playgroud)