DEVELOPMENTOR*LEARNING RESOURCE LAB.

ソフトウェア開発現場の視点からソフトウェアと開発者の価値を高める「ホットな何か」をお届けします。(休止)

Jcode.pmを使って文字列を「\uXXXX」形式に変換する

2007年01月15日 | perl

Introducing JSON」の中で、JSONのstringは「uXXXX 4 hexadecimal digits」と表現できるとあります。この表現はJavaScript::UCSエンコードと呼んだりするようです。

このエンコードの意味を理解するため、Jcode.pmを使って、指定した文字列を「uXXXX」形式に変換するPerlスクリプトを書いてみました。↓こんな感じです。


View example

このPerlスクリプトは、Perl 5.6以前を対象としています。Perl 5.8以降ならEncode.pmを使って、より手軽に実現できるハズです。

  1. 指定した文字列の文字コードをEUC-JPからUCS2に変換します。
  2. unpack関数を使ってUCS2文字列を16bit(short)単位に分割します。
  3. 16bit(short)から「uXXXX」形式の文字列を作ります。これを分割した分だけ繰り返しします。
  4. 最後に「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";