8

Webサイトをクロールし、そのJSONから情報を収集しています。結果はハッシュに保存されます。しかし、一部のページで「JSON文字列の不正な形式のUTF-8文字」エラーが発生します。「cafe」の最後の文字でエラーが発生することに気づきました。キャラクターの種類が混在しているからだと思います。だから今、私はすべてのタイプの文字をutf-8に変換する方法を探しています(そのような完璧な方法があることを願っています)。utf8 :: allを試しましたが、機能しません(正しく実行しなかった可能性があります)。私は初心者です。助けてください、ありがとう。


アップデート

さて、「文字列とUTF-8文字列の違いを知っている」という記事を読んだ後、 briandfoyによって投稿されました。私はコードで問題を解決します:

use utf8;
use Encode qw(encode_utf8);
use JSON;


my $json_data = qq( { "cat" : "Büster" } );
$json_data = encode_utf8( $json_data );

my $perl_hash = decode_json( $json_data );

これが他の誰かを助けることを願っています。

4

1 に答える 1

24

decode_jsonJSONがUTF-8を使用してエンコードされていることを想定しています。

ソースファイルはUTF-8を使用してエンコードされていますが、Perlは(必要に応じて)を使用してデコードしuse utf8;ます。これは、文字列にUnicode文字が含まれていることを意味し、それらの文字を表すUTF-8バイトではありません。

示したように、文字列をに渡す前に文字列をエンコードできますdecode_json

use utf8;
use Encode qw( encode_utf8 );
use JSON   qw( decode_json );

my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(1)->decode(encode_utf8($data_json));
   -or-
my $data = JSON->new->utf8->decode(encode_utf8($data_json));
   -or-
my $data = decode_json(encode_utf8($data_json));

しかし、文字列がすでにデコードされていることをJSONに伝えることができます。

use utf8;
use JSON qw( from_json );

my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(0)->decode($data_json);
   -or-
my $data = JSON->new->decode($data_json);
   -or-
my $data = from_json($data_json);
于 2012-05-22T21:29:13.257 に答える