「Introducing JSON」の中で、JSONのstringは「uXXXX 4 hexadecimal digits」と表現できるとあります。この表現はJavaScript::UCSエンコードと呼んだりするようです。
このエンコードの意味を理解するため、Jcode.pmを使って、指定した文字列を「uXXXX」形式に変換するPerlスクリプトを書いてみました。↓こんな感じです。
このPerlスクリプトは、Perl 5.6以前を対象としています。Perl 5.8以降ならEncode.pmを使って、より手軽に実現できるハズです。
- 指定した文字列の文字コードをEUC-JPからUCS2に変換します。
- unpack関数を使ってUCS2文字列を16bit(short)単位に分割します。
- 16bit(short)から「uXXXX」形式の文字列を作ります。これを分割した分だけ繰り返しします。
- 最後に「uXXXX」形式の文字列をすべて結合します。
#!/usr/bin/perl use strict; use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); ## &main; exit; ## sub main { my $q = param('q'); my $r = param('q'); $r = &kanjicode($r, 'ucs2', 'euc'); my @r = unpack('n*', $r); @r = map { sprintf("\u%04X", $_); } @r; $r = join('', @r); print CGI::header( -type => 'text/html', -charset => 'EUC-JP' ); print &load_template('jsucs', q => $q, r => $r ); } ## sub load_template { my ($name, %param) = @_; use HTML::Template; my $template = new HTML::Template( filename => "./$name.tmpl", die_on_bad_params => 0 ); $template->param( %param, ); return $template->output; } ## sub kanjicode { my ($textref, $kanjicode, $ikanjicode) = @_; use Jcode; &Jcode::convert($textref, $kanjicode, $ikanjicode); return $$textref; } "True Value";