Unicode正規化用のWeb APIを作ってみた

URIエンコードとかHTMLエンティティ化とかならいろんなとこが提供してると思うんですが,
Unicode正規化に関しては見かけたことがなかったので,ちょっとした確認に使いたいと思って作りました.
http://gemini.sys.es.osaka-u.ac.jp/~arabiki/normalize.html

せっかくなんでWeb APIにしてみましたが,研究室のサーバということもありそんなに長くは提供できないと思います…
その時はFavmemoのサーバでも使いましょうか…

使い方

URI
http://gemini.sys.es.osaka-u.ac.jp/~arabiki/api/normalize.json

メソッド
GET, POST

パラメータ

  • text: Unicode正規化する文字列
  • form: NFD, NFC, NFKD, NFKC のいずれか

デモ

PHP
normalize.php

<?php
$apiUri = 'http://gemini.sys.es.osaka-u.ac.jp/~arabiki/api/normalize.json';
$text = 'あアア44AA@@##ばぱバパ';
$form = 'NFKC';
$apiUri .= $apiUri.'?text='.urlencode($text)."&form=$form";
$ret = json_decode(file_get_contents($apiUri));
echo $ret[0],"\n";
?>

実行

$ php normalize.php
php normalize.php
あアア44AA@@##ばぱバパ

R
normalize.R

library(RCurl)
library(RJSONIO)

apiUri <- "http://gemini.sys.es.osaka-u.ac.jp/~arabiki/api/normalize.json"
text <- "あアア44AA@@##ばぱバパ"
form <- "NFKC";
apiUri <- paste(apiUri, "?text=", curlEscape(text), "&form=", form, sep = "")
ret <- fromJSON(getURL(apiUri))[[1]]
cat(ret, fill = TRUE)

実行

$ R --slave -f normalize.R
Loading required package: bitops
あアア44AA@@##ばぱバパ

JavaScript
デモページ(http://gemini.sys.es.osaka-u.ac.jp/~arabiki/normalize.html)のソースを見てください
jQueryですが…
※クロスドメイン制約のため特殊なことをするかスクリプトを自分のサーバに設置する必要があります

コード

#!/usr/bin/perl
use CGI;
use utf8;
use JSON;
use Unicode::Normalize;

my $q = new CGI;
print "Content-Type: application/json; charset=utf-8\n\n";
# こうするとUTF-8フラグが付与されるけどバグがあって文字化けする
# cf. http://blog.nomadscafe.jp/archives/000491.html
#print $q->header(-type => 'application/json', -charset => 'utf-8');
my ($text, $form) = (&url_decode($q->param('text')), $q->param('form'));
chomp $text;

my $ret = $form =~ /^(NFK?[DC])$/ ? eval "$1 '$text'"
     : "Error: One of 'NFD', 'NFC', 'NFKD', or 'NFKC' must be specified as 'form'.\n";

# cf. http://gihyo.jp/dev/serial/01/perl-hackers-hub/000402?page=2
my $json = JSON->new;
$json->ascii(1);
$ret = $json->encode([$ret]);
print "$ret\n";

# cf. http://sonic64.com/2003-08-31.html
sub url_decode($) {
    my $str = shift;
    $str =~ tr/+/ /;
    $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
    return $str;
}
広告
Rの文字出力に便利な関数を作ってみた Rでベンチマークテスト
※このエントリーははてなダイアリーから移行したものです。過去のコメントなどはそちらを参照してください