UNICOD APIの重要な一歩
一、Unicodeの概要
1、UnicodeはASCII文字セットから拡張する.厳格なASCIIでは、各文字は7ビットで表されるか、コンピュータで一般的に使用されている各文字は8ビット幅である.Unicodeは全16ビット文字セットを使用します.つまり、幅の広い文字セットです.
2、charには1つの変数に1つのASCII文字しか保存できませんが、1つのcharポインタは複数保存できます.データcharと同様に、最後の文字は/0を保存するために使用されます.
3、Cのワイド文字はwchar_に基づくいくつかのヘッダファイルにWHAR.Hを含むtデータ型
Typedef unsigned short wchar_t;これは16ビット幅の文字で、Unicodeでもあります.
Wchar_t *p=L”Hello!”最初の引用符のすぐ前の大文字L(long)は、コンパイラに文字列を広い文字で保存すると占有されることを示します.
2
バイトです.
4、ワイド文字の長さを得る:
ASCIIの文字列長:
char *pc=”Hello!”;iLength=strlen(pc);ここでiLengthは6すなわち文字数に等しい.
UniCode文字列の長さ:
Wchar_t *pw=L”Hello!”;iLength=strlen(pw);iLenghtが1に等しいのは「hello!」の文字占有率16ビット:0 x 0048(H)0 x 0065(e)……プロセッサはメモリに保存します:48 00 65 00.....strlenは00まで読んですべて1ビットだけを終了することを表します!
ここでは、ワイド文字を計算するstrlen、すなわちwcslen(wide-character string length)を使用し、STRING.HおよびWHAR.Hで説明します.Strlen関数の説明は次のとおりです.
Size_t__cdecl strlen(const char*);
Size_t__cdecl wcslen(const wchar_t*);これによりiLenght=wcslen(pw)を用いてその長さを計算することができ,結果として6をワイドバイトに変更した後,文字列の文字長は変化せず,ビット数長が変化しただけである.
文字列パラメータを持つすべてのC実行リンクライブラリ関数には、ワイド文字版があります.Printfのワイド文字版はwprintfで、これらの関数はWHAR.Hと標準関数の説明を含むヘッダーファイルで説明されています.
二、単一原始コード:
(
tchar.h
)
ワイド文字実行期間リンクライブラリの関数は通常の関数よりも大きいので、ASCIIとUnicode文字列を2つのバージョンのプログラムで処理します.
すぐに処理できる
ASCII
また処理できる
Unicode
のコードは単一の元のコードファイルです.
1、 TCHAR.Hヘッダファイルを使用します.ANST C規格の部分ではないので、定義された各関数とマクロ定義の前にベースラインがあります.TCHAR.Hは、文字列パラメータを必要とする標準実行リンクライブラリ関数の一連の代替名を提供する.
2、 ここで私たちが使っている単一のオリジナルコードは
_tcslenこの関数はASCIIとUnicodeの中でstrlenを使うかwcslenを使うかを自分で識別します.tcslenはstrlenいつwcslenですか?
Strlen(ASCII
文字の長さ
)
,
wcstrlen(UNICODE
文字の長さ
)
,
_tcslen(
マルチステート文字長)
,
tchar(
マルチステート文字タイプ)
,
wchar_t(
文字の種類
)
,
char(
文字の種類
)
の不定期状態:
名前が定義されている場合
_UNICODE
の識別子であり、プログラムには
TCHAR.H
ヘッダーファイル、では
_tcslen
定義
wcslen
:
#define _tcslen strlen
定義されていない場合
UNICODE
を選択します.
_tcslen
定義
strlen
:
#define _tcslen wcslen
TCHAR.H
新しいデータ型も使用
TCHAR
を使用して、2つの文字データ型の問題を解決します.定義されている場合
_UNICODE
識別子、それでは
TCHAR
そうです
wchar_t
:
Typedef wchar_t TCHAR;
そうでなければ、
TCHAR
そうです
char
Typedef char TCHAR;
3、 文字列前のL処理:
定義されている場合UNICode識別子とはTのマクロは以下のように定義される.
#define _T(X) L##x
//ANSI C規格に準拠したプリプロセッサ仕様です
例:T(“hello”)--
àL”hello”
定義されていなければ_ユニコードではTは以下のように定義される.
#define _T(X) x
他にも2つと_Tが同一とするマクロ定義:
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
4、 Windowsテーブルファイルタイプ:
WINNT.HはCHARTとWHARと呼ばれる新しいデータ形態を定義した.
typedef char CHAR;
Typedef wchar_t WCHAR;//wc
8ビットまたは16ビットの文字を定義する必要がある場合は、CHARとWHARを使用することをお勧めします.WHARの変数を使用する場合は、wcハンガリーマーキング法を先に追加します.
5、8ビットCHAR文字列ポインタとconst 8ビット文字列ポインタのデータ形態
typedef CHAR *PCHAR,*LPCH,*PCH,*NPSTR,*LPSTR,*PSTR;
typedef CONST CHAR *LPCCH,*PCCH,*LPCSTR,*PCSTR;
6、16ビットWHAR文字列ポインタとconst WHAR文字列ポインタ
typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR
以上のいくつかのデータ型は,従来の16ビットシステムのnearとlongポインタを互換化するために用いられた.
7、
#ifdef UNICODE
Typedef WCHAR TCHAR,*PTCHAR;
Typedef LPWSTR LPTCH,PTCH,PTSTR,LPTSTR;
Typedef LPCWSTR LPCTSTR;
#else
Typedef char TCHAR,*PTCHAR;
Typedef LPSTR LPTCH,PTCH,PTSTR,LPTSTR;
Typedef LPCSTR LPCTSTR;
#endif
8、
明確に定義したいなら
8
ビット文字変数と文字列、使用可能
CHAR,PCHAR
および引用符付き文字列.明確に使うために
16
ビット文字変数と文字列、使用可能
WCHAR,PWCHAR
そして
L
引用符の前に追加します.はい
于
8
位はやはり
16
ビットは
UNICODE
識別子の定義された変数または文字列.
TCHAR,PTCHAR
および
TEXT
マクロ.
三、Windows関数呼び出し:
1、MessageBoxの使い方:
WINUSERAP int WINAPI MessageBoxA(HWND hWnd,
LPCSTR lpText,LPCSTR lpCaptiopn,
//2つは8ビットの文字列です
UINT uType);
WINUSERAPI int WINAPI MessageBoxW (HWND hWnd,
LPCWSTR lpText, LPCWSTR lpCaption,// 16
UINT uType);
MessageBox :
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
これで定義したら
UNICODE
識別子、プログラム内のすべての
MessageBox
関数コールは実際には
MessageBoxW
関数;さもないと
MessageBoxA
で行ないます.
2、windowsで定義された文字列関数のセット.これらの関数は文字列の長さを計算し、文字列をコピーし、
接続文字列と比較文字列:
iLength=lstrlen(pString);
pString=lstrcpy(pString1,pString2);
pString=lstrcpyn(pString1,pString,iCount);
pString = lstrcat (pString1, pString2) ;
iComp = lstrcmp (pString1, pString2) ;
iComp = lstrcmpi (pString1, pString2) ;
これらの関数はCリンクライブラリの対応する関数機能と同じである.UNICoded識別子が定義されている場合、これらの関数は広い文字列を受け入れます.そうでない場合、通常の文字列のみを受け入れます.ワイド文字列版のlstrlenW関数はwindows 98で使用できます!
3、printfのwindowsでの応用
ASCII
ワイド文字
標準
パラメータの変数数
標準版
sprintf
swprintf
_stprintf
最大長版
_snprintf
_snwprintf
_sntprintf
Windows
版
wsprintfA
wsprintfW
wsprintf
パラメータ配列のポインタ
標準版
vsprintf
vswprintf
_vstprintf
最大長版
_vsnprintf
_vsnwprintf
_vsntprintf
Windows
版
wvsprintfA
wvsprintfW
wvsprintf