Yggdrasil Seeds : Software Works : UniDB
PV[986171]

UniDB V0.02



システム非依存なUnicode処理を目指して作ったライブラリで、Borland CとMinGW on Cygwinに対応してます。
今のところ、いくつかの文字セットからディコードすることしかできないけど。

ダウンロード

ライブラリ
ソース

組み込み

UniDBの各種DLLを利用するソースファイルに UNIDB.H をインクルードします。また、インポートライブラリを利用する場合は UDBDEC.LIB をリンクします。

ディコード手順

単に udb_decode() を呼ぶだけですが、事前にコールバック関数を用意する必要があります。この関数はUnicodeの文字が1つ検出される度に呼ばれるものです。

#include "unidb.h" /*文字数カウント用*/ static UDBBOOL cbcount(PUDBVOID tag,PUDBCBPRM prm){ PUDBU4 p=tag; (*p)++; return TRUE; } /*文字書き込み用*/ static UDBBOOL cbputch(PUDBVOID tag,PUDBCBPRM prm){ PUDBU2 p=tag; p[0]=(prm->cond==UDBCOND_MISS)?'?':prm->ch; p++; return TRUE; } void hogege(){ PUDBU2 buf; UDBU4 ct=0; UDBDECF f=UDBDECF_NOCTRL|UDBDECF_UTF16|UDBDECF_CR|UDBDECF_LF; PUDBVOID cset="Shift_JISX0213"; /*まず文字列のサイズを調べる*/ udb_decode(str,cset,f,&ct,cbcount); buf=malloc(sizeof(UDBU2)*(ct+1)); if(!buf)return; /*ここで文字列を書き込む*/ udb_decode(str,cset,f,buf,cbputch); buf[ct]=0; : : free(buf); }

ディコード可能な文字エンコーディング


コールバック関数


typedef UDBCALLTYPE UDBBOOL (*UDBCBDECODE)(PUDBVOID tag,PUDBCBPRM prm);
引数
tagユーザポインタ
prm各種パラメータ

処理内容
渡されたパラメータに対する任意の処理を行う。
構造体 UDBCBPRM の内訳は次の通り。
cur参照中の文字位置
len↑で使っているサイズ
ch抽出された文字コード
cond文字状態
UDBCOND_HIT抽出成功
UDBCOND_COMP上位互換解釈
UDBCOND_MISS抽出失敗

返値
TRUE処理続行
FALSE処理中断


インポート関数


UDBRES UDBEXPORTTYPE udb_decode(UDBCSTR str,UDBCSTR cset,UDBDECF decf,PUDBVOID tag,UDBCBDECODE cbdecode)
引数
strディコード対象文字列
cset文字セット指定文字列
decfディコードオプションフラグ
UDBDECF_ASCIIISO-646系文字集合を強制的にASCIIとして扱う
UDBDECF_NOCTRLTAB,LF,VT,FF,CR以外のコントロールコードを除去する
UDBDECF_UTF16コールバックで渡す文字コードをUTF-16にする
UDBDECF_STRICT上位互換解釈をしない
(元の実装がEかげんなので、あまり当てにするべからず)
UDBDECF_CR改行検出時、コールバックでCRを渡す
UDBDECF_LF改行検出時、コールバックでLFを渡す
tagコールバックに渡すユーザポインタ
cbdecode文字検出コールバック

処理内容
strをディコードし、そこで検出された文字毎にコールバックを呼ぶ。

返値
UDBRES_OK正常に処理完了
UDBRES_ABORTコールバックにより中断された
UDBRES_UNSUPcsetが非対応
UDBRES_SHORTstrの終端が余った
UDBRES_ERROR内部でエラー発生


更新履歴

V0.02
V0.01