概要
JSON::PPで日本語を扱う場合のuse utf8;を利用した場合と、そうではない場合の違いについて、また利用メソッドの違いについてまとめます。
ソースコードはutf8で記述するものとします。
比較するメソッド
メソッド | 備考 |
---|---|
encode_json() | use utf8時にutf8文字列作成 |
JSON::PP->new->utf8(0)->encode() | 内部コードで文字列作成 |
方法とコード
まずは、以下コードを用います。次にuse utf8;を消して行います。
#!perl
use v5.40;
use utf8; # ← 使用する場合とそうでない場合を比較
use JSON::PP;
use Encode;
my $x = [{a=>1, b=>"テスト"}, {a=>1, b=>"試験"}];
my $a = encode_json($x);
my $b = JSON::PP->new->utf8(0)->encode($x);
printf("a1:%s\n",$a);
printf("a2:%s\n",encode_utf8($a));
printf("a3:%s\n",decode_utf8($a));
printf("a4:%s\n",encode_utf8(decode_utf8($a)));
printf("b1:%s\n",$b);
printf("b2:%s\n",encode_utf8($b));
printf("b3:%s\n",decode_utf8($b));
printf("b4:%s\n",encode_utf8(decode_utf8($b)));
結果1 encode_json()を用いた場合
方法 | use utf8あり | use uft8なし |
---|---|---|
そのまま出力 | 問題なし | 文字化け |
encode_utf8() | 文字化け | 文字化け |
decode_utf8() | Wide character警告 | 問題なし |
encode_utf8(decode_utf8()) | 問題なし | 文字化け |
結果2 JSON::PP->new->utf8(0)->encode()を用いた場合
方法 | use utf8あり | use uft8なし |
---|---|---|
そのまま出力 | Wide character警告 | 問題なし |
encode_utf8() | 問題なし | 文字化け |
decode_utf8() | Wide characterエラー | Wide character警告 |
encode_utf8(decode_utf8()) | Wide characterエラー | 問題なし |
まとめ
今までuse utf8;を使用し、JSON::PP->new->utf8(0)->encode()で文字列を作り、encode_utf8()で出力文字列を作っており、他の方法だとどうなるのかわからなかったので作成してみました。
内部コード、外部コードを意識しながら正しくコーディングしたいものだと改めて実感しました。
ありがとうございました。