libnkfm nkfライブラリもどき を OSX で使う。

 

日本語文字コード変換フィルタ「nkf」のライブラリもどき

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

    Tsukubado