日本語入力のユーザー辞書について、 下にあげた一般的な日本語入力エンジンで 共通にインポート可能なフォーマットがあります。 なお品詞は名詞に限るとします。
辞書をエクスポートするとヘッダが付加されたりしますが、 本体のフォーマットはどのIMEでもだいたい同じです。
<ひらがな> <タブ> <変換文字列> <タブ> <品詞> <タブ> <コメント> <改行>
したがってエンコードだけの問題なのですが、 MS-IMEが一番制限がきつくてMS-IMEが読み込める utf-16 & little-endian & BOM付き (以下utf-16leb) にすればどの日本語入力エンジンからでもインポートできるようになります。 要するにWindows様に合わせろということです。
まったくutf-16はウンコです。 本当は滅んでほしいのですが…
テキストエディットで保存時にエンコーディングとして "Unicode (UTF-16)" を選べば、utf-16lebで書き出せます。 ただし新規作成した場合でないと選べないので、 別に開いたウインドからコピペする必要があります。
メモ帳でエンコーディングとして "Unicode"を選べば、 utf-16lebで書き出されます。
iconvでは直接この形式に変換できないみたいで、 以下のようなことをしないとダメっぽいです。
# printf "\377\376" > bom-le.txt
# cat utf8.txt | iconv -f utf-8 -t utf-16le > utf16le.txt
# cat bom-le.txt utf16le.txt > utf16leb.txt
Perlスクリプトを書いたのでおいておきます。 ご自由にお使いください。
中身はこんな感じです。
#!/usr/bin/perl
# utf-8のファイルを utf-16 little-endian BOM付きに変換する。
# iconvで -t utf-16le とやるとBOM無しのファイルができるので、
# 先頭に \xFF\xFEを追加しても良いが。
# cat utf8.txt | utf8-to-utf16leb.pl > utf16leb.txt
use strict;
use Encode;
# 読み込む
my $text = '';
while( defined(my $line = <>)){
$text .= $line;
}
# CRLFにしてしまえ!
$text =~ s/\r\n/\n/g;
$text =~ s/(\n|\r)/\r\n/g;
# Little Endian UTF-16 に。
Encode::from_to($text,"utf-8","utf-16le");
# BOMを書き出す。
print "\xFF\xFE";
# 本文を書き出す。
print $text;
# おしまい