0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PerlAdvent Calendar 2024

Day 6

JSON::PPのencodeメソッドと日本語とutf8

Last updated at Posted at 2024-12-07

概要

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?