BCB/nkf(漢字コード変換フィルタ)を使う

UNIXで有名な漢字変換フィルタソフトをWindowsでも利用できたら、ということで移植されたものです。尽力された方々に感謝して使ってみたいと思います。

このネットワーク用漢字コード変換フィルタである、nkf32.dllをBCBで利用してみます。このDLLの入手先はこちらです。

シフトJIS,EUC-JP,ISO-2022-JP,UTF-8,UTF-16といった漢字コードの相互変換。半角文字と全角文字の変換、文字列で使用されているコード種別の判定、などが可能です。

目次

ダウンロード

ココから実行ファイル(nkfwin.zip)をダウンロードします。呼出時に必要なヘッダファイルも実行ファイル書庫内に同梱されているのでソースファイル(nkfsrc.zip)は取りあえず不要です。

準備

  • 新規にVCLフォームのプロジェクトを作成します。
  • 私のOSはWindowsXPなので、NTフォルダ内のnkf32.dllを実行ファイルが作成されるフォルダにコピーします。
  • また、nkf.hをソースファイルと同じフォルダへコピーします。
  • インポートライブラリを作成します。
>implib nkf32.lib nkf32.dll
  • プロジェクト→オプション→リンカ設定(ilink32)→パスと定義、のライブラリ検索パスに作成したインポートライブラリの場所を追加します。
  • このライブラリをリンクする旨をソースファイルのどれかにプラグマで宣言します。
#pragma link "nkf32.lib"

それぞれの関数呼出

バージョン取得

void CALLBACK GetNkfVersion(LPSTR verStr);

LPSTRで示されるアドレスに無条件にバージョン情報がコピーされます。あらかじめ必要な分、メモリを確保しておく必要があります。

文字列長は考慮されないので安全性を担保するにはGetNkfVersionSafeを使いましょう。

BOOL WINAPI GetNkfVersionSafeA(LPSTR verStr,DWORD nBufferLength /*in TCHARs*/,LPDWORD lpTCHARsReturned /*in TCHARs*/);
BOOL WINAPI GetNkfVersionSafeW(LPWSTR verStr,DWORD nBufferLength /*in TCHARs*/,LPDWORD lpTCHARsReturned /*in TCHARs*/);
BOOL WINAPI GetNkfVersionSafe(LPTSTR verStr,DWORD nBufferLength /*in TCHARs*/,LPDWORD lpTCHARsReturned /*in TCHARs*/);

A版は通常版。W版はUNICODE版です。

無印版は、UNICODEという語が#defineされているかどうかでA版/W版を切り替えます。

LPSTR verStr 文字列を受け取るバッファのポインタ
DWORD nBufferLength バッファのサイズ
LPDWORD lpTCHARsReturned 文字列のサイズ(\0を含む)

使用例:

DWORD length;

// わざと取得を失敗させてバージョン文字列の長さを取得する.
GetNkfVersionSafeA(NULL, 0, &length);

// 今度はちゃんとメモリを確保.
LPSTR verSTR = new char[length];

bool result = GetNkfVersionSafeA(verSTR, length, &length);

if (result) {
    AnsiString str;
    str.printf("バージョン取得成功 version = %s", verSTR);
    Memo1->Lines->Add(str);
}
else {
    Memo1->Lines->Add("バージョン取得失敗");
}

機能の取得

BOOL WINAPI GetNkfSupportFunctions(void *outStr,DWORD nBufferLength /*in Bytes*/,LPDWORD lpBytesReturned /*in Bytes*/);

著作権、バージョン、他のnkf32.dllとの互換性を調べます。領域が不足する場合はnBufferLengthで指定した分だけ構造体の先頭からのデータを返します。

struct {
    DWORD size;
    LPCSTR copyrightA;
    LPCSTR versionA;
    LPCSTR dateA;
    DWORD functions;
};
outStr データを受け取るメモリ
nBufferLength outStrの領域長をバイト数で与えます
lpBytesReturned 構造体の長さをバイト数で返します

使用例:

struct {
    DWORD size;
    LPCSTR copyrightA;
    LPCSTR versionA;
    LPCSTR dateA;
    DWORD functions;
} x;
DWORD length;

bool result = GetNkfSupportFunctions(&x, sizeof(x), &length);

if (result) {
    Memo1->Lines->Add("機能の取得に成功");
    AnsiString temp;
    temp.printf("構造体の長さ:%u", length);
    Memo1->Lines->Add(temp);
    temp.printf("著作権文字列:\r\n%s", x.copyrightA);
    Memo1->Lines->Add(temp);
    temp.printf("バージョン:%s", x.versionA);
    Memo1->Lines->Add(temp);
    temp.printf("日付:%s", x.dateA);
    Memo1->Lines->Add(temp);
    Memo1->Lines->Add("互換性:");
    if (x.functions & 0x01) {
        Memo1->Lines->Add(" nkf32103a.lzh 1.03と互換機能あり");
    }
    if (!(x.functions & 0x02)) {
        Memo1->Lines->Add(" nkf32dll.zip 0.91と互換機能なし");
    }
    if (x.functions & 0x04) {
        Memo1->Lines->Add(" nkf32204.zip 2.0.4.0と互換機能あり");
    }
    temp.printf("UNICODEのサポート:%s",
        (x.functions & 0x80000000) ? "あり" : "なし");
    Memo1->Lines->Add(temp);
}
else {
    Memo1->Lines->Add("機能の取得に失敗");
}

リンク


2007-04-22 komina