フリーウェアの利用 NKF(Network Kanji Filter)
ネットワーク用漢字コード変換フィルタ
NKFは古くからある日本語の文字コードに対応したコード変換ツールで、ファイルや標準入力からの入力を自動認識して標準出力に出力します。対応している漢字コードは、JIS、Shift_JIS、日本語
EUC、UTF-8、UTF-16 です。対応する各コード間の変換に加えて、半角全角変換やMIME変換の機能も有しています。
通常は単独のソフト(NKF32.exe)として利用することが多いと思いますが、プログラムから呼び出すようにdll(NKF32.dll、NKF32.h)が提供されています。ここでは、Embarcadero
C++ Compiler でSJIS<->UTF-8の変換を行う場合の手順、プログラムへの組込み方を紹介します。
1)ソフトの入手
ソフトは「nkf.exe nkf32.dll Windows用」で、Vectorのサイトの以下のURLからダウンロードできます。
https://www.vector.co.jp/soft/win95/util/se295331.html
含まれるファイルの中で、以下のファイルを使用します。「nkf32.lib」は「nkf32.dll」から作成します。
┣dll(developer)
┃ ┣api.txt 開発者向けの技術資料
┃ ┗nkf32.h 開発者向けのヘッダファイル
┣vc2005\dll(NT,2000,XP,Vista,7)
┃ ┗nkf32.dll Windows NT,2000,XP,Vista,7用のnkf32.dll
必要なファイルを特定のフォルダ(例:C:\borland\program\freeware3 )に保管します。
2)開発プロジェクト
多くの方が関わっているプロジェクト: nkf Network Kanji Filter(http://sourceforge.jp/projects/nkf/)です。優れたソフトの開発、提供に感謝します。
3)ライブラリの作成
Embarcadero C++ Compilerのコマンドラインツールのimplib.exeを使って、上記のNKF32.dllからライブラリ(NKF32.lib)を作成します。
実行結果は以下の@です。
@ライブラリの作成

ヘッダーファイル(NKF32.h)をインクルードし、NKF32.libを組み込んだ実行ファイルを作成します。内容は、SJISの文字列をUTF-8に変換してファイルに出力します。次にそれを再度SJISに変換して、ファイルに出力します。
ソースプログラムがA、コンパイル結果はB、プログラムの実行結果はCです。出力ファイルの表示結果がD(UTF-8)、E(SJIS)です。
Aソースプログラム
// -------------------------------------------------
// NTF32.dll のテスト
// ntf32dll_1.c
// 文字列をSJIS -> UTF-8 に変換する。
// UTF-8 -> SJIS に変換する。
// 2022/01/08 Kimio Nakamura
// -------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "nkf32.h"
char *text_org = "@スーパーコンピュータの世界ランキングで「富岳」が計算速度で9年ぶりに一位になった。
ACPUとしてスマホに使われているARM社のものに合わせ、OSもレッドハット版のリナックスを使っている。";
// =========================================================================
// Name : void main(void)
// Usage : メイン関数
// Parameter: ファイル名
// Return : なし
// =========================================================================
int main( int argc , char *argv[])
{
char version[20];
char text_utf8[10000];
char text_sjis[10000];
FILE *fp_utf8 , *fp_sjis ;
// 出力ファイル(UTF-8)設定
if((fp_utf8 = fopen( "output_utf8.txt" , "wt" ))==NULL) {
printf("File(UTF-8) open error\n");
}
// 出力ファイル(SJIS)設定
if((fp_sjis = fopen( "output_sjis.txt" , "wt" ))==NULL) {
printf("File(SJIS) open error\n");
}
// バージョン表示
GetNkfVersion( version );
fprintf(stdout , "version:%s\n", version);
fprintf(stdout, "Text :%s\n\n", text_org);
// オプション設定(UTF-8へ)
SetNkfOption("-wx");
// コード変換 SJIS -> UTF-8
NkfConvert(text_utf8 , text_org);
fprintf( fp_utf8 , "Text UTF8:%s\n\n", text_utf8);
// オプション設定(SJISへ)
SetNkfOption("-sx");
// コード変換 UTF-8 -> SJIS
NkfConvert(text_sjis , text_utf8);
fprintf( fp_sjis , "Text SJIS:%s\n\n", text_sjis);
fclose(fp_utf8);
fclose(fp_sjis);
return 0;
}
Bコンパイル結果

C実行結果

D出力ファイル(SJIS->UTF-8)

E出力フィル(UTF-8->SJIS)

ここで使用したソースファイルはこちらです。NKF32.dll、NKF32.Hは、先に紹介したサイトから取得してください。NKF32.libはツールを使って作成してください。
NKF32.dllで利用できる文字列のSJIS-UTF8変換に使う関数を紹介します。この2関数以外にもファイルの一括変換、MIME変換、全角半角変換などの関数も用意されています。
【関数名】変換オプションの指定
int CALLBACK SetNkfOption(LPCSTR optStr);
・機能
変換オプション文字列を指定します。連続したオプションの指定も可能です。
無効なオプションは無視されます。先頭の"-"は省略可能です。
・引数
optStr 変換オプション文字列
・戻り値 なし
・備考
出力コード指定
-j:JIS コード -e:EUC コード、-s:Shift_JIS コード
-w -w80:UTF8 コード(BOM 無し)、-w8 UTF8 コード(BOMあり)
-w16 -w16B0:UTF16 コード (Big Endian / BOM 無し) 、
-w16B:UTF16 コード(Big Endian / BOM 有り)
-w16L:UTF16 コード (Little Endian / BOM 有り) 、
-w16L0:UTF16 コード(Little Endian / BOM 無し)
入力コード指定
-J:JIS、-E:EUC、 -S:SJIS、-W -W8:UTF-8、
-W16 -W16L:UTF-16 (Little Endian)、-W16B:UTF-16 (Big Endian)
その他
-x 半角カナから全角カナへの変換を行わない。(デフォルトで行う、-X でも可)
改行コード変換(デフォルトでは変換しない)
-Lu -d:unix (LF)、-Lw -c:windows (CRLF)、-Lm mac (CR)
|
【関数名】文字コード変換
void CALLBACK NkfConvert(LPSTR outStr, LPCSTR inStr);
BOOL WINAPI NkfConvertSafe(LPSTR outStr,DWORD nOutBufferLength
,LPDWORD lpBytesReturned, LPCSTR inStr,DWORD nInBufferLength );
・機能
文字コードを変換します。変換方法は変換オプションの指定で行っておきます。
出力文字列、入力文字列の順です。
・引数
outStr 出力文字列
inStr 入力文字列
nOutBufferLength outStrの領域長(バイト数)
lpBytesReturned 出力文字列の長さ(バイト数、null含まず)
nInBufferLength 入力文字列の長さをバイト数で与えます。
・戻り値
NkfConvert・・なし
NkfConvertSafe・・関数が成功すると、0 以外の値、失敗すると0
・備考
※NkfConvert
outStr inStrは1バイトの0で終了する文字列
UTF-16は文字コードに値が0のバイトが含まれるため扱えない。
※NkfConvertSafe
nOutBufferLength > lpBytesReturned の場合に出力文字列の後ろに0を
1バイト付加します。
|
|