May 12, 2004
某案件で、Shift_JIS の CSV ファイルから、DB に EUC-JP で突っ込む必要があったらしい。
んで、CSV を
よく見ると、どうやら人名とかで
(←の例はあくまで極端な名前の例で、実際のデータとは関係ありません)
こんな感じの、所謂「難字 (異字体)」 が使われていると、nkf とか Jcode とかの変換がちゃんとできず、なんか制御コードとかが混じるようだ。
K 氏「うーん、どうしたものか」
にぽたん「そしたらさ難字を全部簡単な字に変換してからさ、それを nkf で EUC-JP にすればいいんだよ」
K 氏「え、そんなの出来んの?」
にぽたん「多分、木村さん作の Lingua::JA::Regular ってそういうの出来るよ」
早速 Shift_JIS の CSV から読み込んで
んで、CSV を
nkf -e
して入れてたらしいんですが、どうも特定のレコードで妙にバケる。よく見ると、どうやら人名とかで

こんな感じの、所謂「難字 (異字体)」 が使われていると、nkf とか Jcode とかの変換がちゃんとできず、なんか制御コードとかが混じるようだ。
K 氏「うーん、どうしたものか」
にぽたん「そしたらさ難字を全部簡単な字に変換してからさ、それを nkf で EUC-JP にすればいいんだよ」
K 氏「え、そんなの出来んの?」
にぽたん「多分、木村さん作の Lingua::JA::Regular ってそういうの出来るよ」
早速 Shift_JIS の CSV から読み込んで
Lingua::JA::Regular->new($str)->kanji
とかしてみた。_/ ̄|○il||li 出来ない。。。
よく見ると Shift_JIS が対象なんだけど Lingua::JA::Regular がコンストラクタで
Jcode->new($str, $icode)->euc
しているので、その時点でコケてしまっている模様。なので、Lingua::JA::Regular を継承した Lingua::JA::Regular::Sjis とか作って、内部的に Shift_JIS だけを使うようにし、
$CHARACTER_UNDEF_REGEX
は Perl メモ から「SJIS未定義文字(機種依存文字を含む)」を拝借し、とりあえず漢字テーブルだけでも Shift_JIS だけにしようと、エラい苦労してテーブル作ってました。package Lingua::JA::Regular::Table::Kanji::Sjis; use strict; use vars qw(@ISA @EXPORT %KANJI_ALT_TABLE); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(%KANJI_ALT_TABLE); %KANJI_ALT_TABLE = ( "\xFA\x67" => "\x93\xE3", # 薙 "\xFA\x9C" => "\x92\xCB", # 塚 "\xFA\x9D" => "\x91\x9D", # 増 "\xFA\xAA" => "\x8A\xB0", # 寛 "\xFA\xB1" => "\x8D\xE8", # 崎 "\xFA\xCD" => "\x8B\xB3", # 教 "\xFA\xD8" => "\x90\xB0", # 晴 "\xFA\xE0" => "\x98\x4E", # 朗 "\xFA\xEE" => "\x89\xA1", # 横 "\xFB\x43" => "\x90\xB4", # 清 "\xFB\x50" => "\x90\xA3", # 瀬 "\xFB\x5E" => "\x92\x96", # 猪 "\xFB\x6E" => "\x95\x72", # 瓶 "\xFB\x75" => "\x89\x76", # 益 "\xFB\x7D" => "\x97\xE7", # 礼 "\xFB\x7E" => "\x90\x5F", # 神 "\xFB\x80" => "\x8F\xCB", # 祥 "\xFB\x82" => "\x95\x9F", # 福 "\xFB\x86" => "\x96\xF5", # 靖 "\xFB\x89" => "\x90\xB8", # 精 "\xFB\x8E" => "\x8F\x8F", # 緒 "\xFB\x92" => "\x89\x48", # 羽 "\xFB\x9E" => "\x8C\x4F", # 薫 "\xFB\xA9" => "\x8F\x94", # 諸 "\xFB\xAE" => "\x97\x8A", # 頼 "\xFB\xB4" => "\x88\xED", # 逸 "\xFB\xB6" => "\x98\x59", # 郎 "\xFB\xB7" => "\x93\x73", # 都 "\xFB\xB8" => "\x8B\xBD", # 郷 "\xFB\xE8" => "\x8A\xD4", # 間 "\xFB\xE9" => "\x97\xB2", # 隆 "\xFB\xF2" => "\x90\xC2", # 青 "\xFB\xF6" => "\x94\xD1", # 飯 "\xFB\xF7" => "\x8E\x94", # 飼 "\xFB\xF9" => "\x8A\xD9", # 館 "\xFB\xFC" => "\x8D\x82", # 高 "\xFC\x49" => "\x92\xDF", # 鶴 "\xFC\x4B" => "\x8D\x95", # 黒 ); 1; __END__
そして、苦労の甲斐…なく、なんかうまくいかん。テーブル作るの時間掛けてメイン部分は 30 分程度のお手軽ハックだったからなのかな…。または Shift_JIS だからマッチングがうまくいかんのか。
ふーむ、どうしようかな…………………
と K 氏と二人で頭を悩ませてると、加藤鷹似の S 氏がヒトコト。
「nkf とかがダメなら Jedit みたいなエディタで開いて変換して保存すればいいんじゃない?」
なんでエディタの代表格が Jedit なのかとはあえて問わなかったけど、、、まぁ確かに言う通りだし、やればそれが一番早いでしょう。そして、Shift_JIS 難字テーブル作った数十分の苦労虚しく、S 氏のソリューションで問題なく変換出来てましたよ。出来ましたとも。あー、出来ましたさ。
でもさ、S くん。。。
ヽ(`Д´)ノ<開発畑の人間として、探究心を弄ぶぐらいの遊び心は無いのかぁ!!
ということで、Lingua::JA::Regular は、Jcode を介さずに Shift_JIS とかでもイケる版 (new() の第二引数か Jcode::getcode() の戻値で import する置換テーブルを切り替えるとか…) を出してホスィ。
とかいって要求ばかりで協力しようとする姿勢を見せない、ラクしたがりのだめぽなオイラ…。