MacOSX で文字コードを変換したいが... OSX でのやり方が今ひとつ分かりにくい。
「libnkfm - nkfライブラリもどき」とは、日本語文字コード変換フィルタ「nkf」をライブラリ化したしたものだそうです。
通常、nkf はコマンドラインからでしか使えないのですが、これを用いればnkfを、一応ライブラリとして使うことができます。
色々あとのことを考えて、「nkfライブラリもどき」という名前らしい。
nkfライブラリもどき
配布サイトはこちら(Kanji Code Conversion Programs のページ)
nkfライブラリもどきはLinux 用ですが、このページでは、nkfもどきを MacOSX 用にコンパイルして nkf 2.0からでも使えるようにしたいと思います。
そこで nkf 2.0 のソースコードを入手します。nkf の配布サイトからダウンロードできます。
nkf
配布サイトはnkfのページ
nkf203.tar をダウンロードして解凍し、最新版のnkf.c をnkfもどきのソースが入っているディレクトリにコピーし入れ替えます。
nkf2.0 では config.h と utf8tbl.c も必要なので同じくコピーしてください。
nkf のバージョン2では UTF8 や UTF16 コードとも変換可能ですが、nkfもどき は nkf 1.9 用にカスタマイズされています。
nkf2.0 でも動作するようにコードを修正しよう
ソースコードを一部変更します。
libnkfm.c の58行目に追加 (UTF8変換テーブルをinclude)
/* UTF8 table */
#include "utf8tbl.c"
nkf.c の113 行目、コメントアウト( libnkfm.c で既に定義されているため )。
/* #include <stdlib.h> */
nkfライブラリ もどきをコンパイル
コンパイルするには、コマンドラインから
make all
やり直す場合は
make clean
make には、Mac OSX 用に修正した makefileを使います。
#makefile.osx for Mac OSX 10.4
CC = gcc
LD = gcc
RANLIB = ranlib
CFLAGS = -fPIC -fno-common
LDFLAGS = -dynamiclib
TARGET = libnkfm.dylib libnkfm.a test-prog1 test-prog2 test-prog3
all:$(TARGET)
libnkfm.dylib:libnkfm.o
$(LD) -o $@ $< $(LDFLAGS)
libnkfm.a:libnkfm.o utf8tbl.o
$(AR) rcv $@ $<
$(RANLIB) $@
libnkfm.o:libnkfm.c nkf.c utf8tbl.c
test-prog1:test-prog.c libnkfm.a
$(CC) -o $@ $^ -I. -DTEST_NKF_CONVERT
test-prog2:test-prog.c libnkfm.a
$(CC) -o $@ $^ -I. -DTEST_NKF_N_CONVERT
test-prog3:test-prog.c libnkfm.a
$(CC) -o $@ $^ -I. -DTEST_NKF_CONVERT_NEW
clean:
$(RM) $(TARGET) *.o
さもなければ、以下のエラーが出ます。
gcc -fPIC -c -o libnkfm.o libnkfm.c
In file included from nkf.c:113,
from libnkfm.c:56:
/usr/include/stdlib.h:175: error: conflicting types for 'realloc'
libnkfm.c:41: error: previous implicit declaration of 'realloc' was here
makeが成功すると、libnkfm.a と libnkfm.dylib 、テストプログラムtest-prog1〜3 が作成されます。
nkfライブラリ もどきの動作テストをしてみよう
適当な文章を書いたファイルを作って文字コード をシフトJISで保存します、テキストエディタのmi で作ると簡単です。
テストプログラムで読み込むファイルの改行コードは、LF(UNIX) か、CR+LF(Windows)にしなければいけません。
そうしないと行を読まずに終了するようです。
テストプログラムは、引数を渡してコマンドラインから実行します。
nkf のオプション、-w は、文字コードをUTF8 形式で出力しますという意味です。
失敗例
User:~/Desktop/libnkfm User$ /Users/Desktop/libnkfm/test-prog3 vec2.txt vec_utf8.txt -w
--------------------------
Test program using nkf_convert_new()
--------------------------
Open file "vec2.txt" for read.
Open file "vec_utf8.txt" for write.
Convert 1 line.
うまく変換された例
User:~/Desktop/libnkfm User$ /Users/Desktop/libnkfm/test-prog3 vec2.txt vec_utf8.txt -w
--------------------------
Test program using nkf_convert_new()
--------------------------
Open file "vec2.txt" for read.
Open file "vec_utf8.txt" for write.
Convert 4 lines.
mi で、vec_utf8.txt を開くと、しっかり UTF8形式に変換されていたことを確認しました。
おわり
nkf 2.0 では UTF-8変換等が追加されたので、大幅に変更しなければいけないと思ったのに、
あまり修正することなく、動作したのがスゴイです。
便利なプログラムをありがとうございます。
Last modified 2006.03.16