1

私たちのページで一部のドイツ語のウムラウトがスクランブルされているのはなぜだろうと思いました。その後、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 モジュールを使用してスクランブルされます。

それらを正しくするには何が必要ですか?

更新: Data::Dumper を使用して出力を表示するのは不適切な場合があります。これは、Dumper が独自のエンコーディングを使用するためです。さて、Dumper との結果の違いは、ここではすべての処理が異なることを示しています。Brad が述べたように、バックエンドについて説明する方が良いかもしれません: json 文字列は Template-Toolkit を使用して出力され、さらに使用するために javascript 変数に割り当てられます。正しいJavaScriptはこのようなものを示しています

{
    "title" : "Geändert",
},

私が取得した新しいモジュールを使用して

{
    "title" : "Geändert",
},

対象ページは 8859-1 (latin1) です。助言がありますか?

4

4 に答える 4

5
my $json_text = to_json($data);

の略です

my $json_text = JSON->new->encode($data);

これは、Unicode コード ポイントの文字列を返します。U+00FC は確かに「ü」の正しい Unicode コード ポイントであるため、出力は正しいです。(証拠として、その HTML ソースは実際には"ü".)

元の出力に実際に何が含まれていたかを判断するのは難しいため (ASCII 以外の文字を表示したため)、問題が実際に何であるかを判断するのは困難です。

ただし、文字列を出力する前に行う必要があることの 1 つは、たとえばEncodeencodeやを使用して、コード ポイントの文字列からバイトに変換すること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);
于 2013-05-17T17:49:16.507 に答える
5

\x{fc}is ü、少なくともLatin-1、Latin-9など。また、Unicodeのüコードポイントです。U+00FCただし、UTF-8 が必要です (おそらく)。UTF-8 文字列リテラルを取得する最も簡単な方法は、Perl ソース コードをこのエンコーディングで保存しuse utf8;、スクリプトの先頭に a を追加することです。

次に、文字列を JSON としてエンコードすると、正しい出力が得られます。

use strict; use warnings; use utf8;
use Data::Dumper; use JSON;
print Dumper encode_json {fields => "nicht überrascht"};

encode_jsonUTF-8 を想定しています。詳細については、ドキュメントを参照してください。

出力:

$VAR1 = '{"fields":"nicht überrascht"}';

(JSON モジュールのバージョン: 2.53)

于 2013-05-17T16:37:00.543 に答える