難字に難儀 - にぽたん研究所

May 12, 2004

このエントリーをはてなブックマークに追加
某案件で、Shift_JIS の CSV ファイルから、DB に EUC-JP で突っ込む必要があったらしい。
んで、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_REGEXPerl メモ から「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 する置換テーブルを切り替えるとか…) を出してホスィ。

とかいって要求ばかりで協力しようとする姿勢を見せない、ラクしたがりのだめぽなオイラ…。

nipotan at 12:57 | Comments(5) | TrackBack(1) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Trackbacks

1. 今日のPerl(息抜き)  [ 人生迷い箸 ]   August 21, 2008 18:47
会社から貸与された新しい機種のPHS端末。まったく電話帳が入っておらず、以前の機種からの引継ぎも出来ないとのことでイライラ。社員の情報は ActiveDirectory で管理されているはずなの...

Comments

1. Posted by よしき   May 12, 2004 19:20
そのとおり!さすがにぽたん探究所。
2. Posted by takah   May 12, 2004 22:16
某案件がなければ、探究心を弄ぶ時間があるはずなんですけどね。。。
タラレバな話ですが。。。

加藤鷹似の S 氏って誰なんでしょう。
気になります。
3. Posted by 地獄変00   May 13, 2004 04:22
これってIBMのメインフレームから吐き出されたデータではないですか?
そうならば私にもほぼ同じ経験がありますね。
「ほぼ」なのは私のほうは逆の方向、
つまりDBから吐き出したデータをメインフレームに入れるために変換するという形だからです。
私のほうは「難字を簡単な字に変換」というのがお客様から許されない状況。
難しい高の字(俗に言うはしごだか)は「はしごだか」のままじゃないとダメでした。
日次バッチで流れる内容のためテキストエディタで変換は無理なんで、
にぽたんさん同様PerlでやってみたんですがShft_JISのせいかうまくいきませんでしたね。

で、気を取り直してawkでやってみたら何故かあっさりうまくいきました。
↓こんな感じです。
http://blog.livedoor.jp/jigokuhen00/8224a89c.zip
Windowsのgawk32でしか動作確認していませんが。

アーカイブ中のdic.txt(辞書ファイル)がにぽたんさんが作ったテーブルと似たような感じですね。
私のほうは、Shift_JISのコード→IBMの文字コードなので違いはあるでしょうが。
ローマ数字などが追加されている形です。
ちなみに辞書ファイルはテキストエディタで開くと同じ字が2つ並んでいるように見えますが、バイナリエディタで見ると違うコードであることがわかります。

お役に立つかどうかわかりませんが私の場合でした。
4. Posted by 地獄変00   May 13, 2004 04:55
ちなみにアップしているファイルは当然仕事で使ったやつではないです(機密保持ありますからね)。
私がさっき組んだものなので、バグってたらごめんなさいです。
単純なヤツなので大丈夫だと思うけど。
5. Posted by きむら   May 13, 2004 13:57
うひ。僕も同じ経験が実はあったりして〜。だったら対応しろよってかんじですが。テキストエディタで変更して、無かったことにしていたのを思い出しました。思い出してしまった。。。

UTF8がらみで、Encode使うバージョンをつくらなきゃなーと思っていたのでいろいろもうちょっと調べてみます。そのうち。たぶん。きっと。もしかして。

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star