概要
 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()で出力文字列を作っており、他の方法だとどうなるのかわからなかったので作成してみました。
 内部コード、外部コードを意識しながら正しくコーディングしたいものだと改めて実感しました。
 ありがとうございました。
