Windowsプログラミング - (b)はUnicodeの紹介

ワイドと2.2 C言語

2.2.2より広範な文字

C言語のワイド文字が短い型データに基づいて、このデータタイプは、ヘッダファイルのプロトタイプがwchar.hで定義されているからです。

符号なしshortのwchar_tのtypedef。

符号なしの短整数、符号なしの短いC言語とそのためのwchar_tワイド文字データ型、16ビット幅です。

例えば:

wchar_tのC = ' A '

お使いのコンピュータに保存され、0x0041である0×41 0×00として表示されます

 

2.2.3ワイド文字ライブラリ関数

strlen関数を計算するワイド文字の長さを使用している場合:

する#include <stdio.hに> 
する#include < 文字列・H> int型のmain()
{ 
  wchar_tの * P = L " こんにちは" 
  printf(" %Dを\ n " strlenを、(P))。リターン0 ; 
}



   

 

結果は、ワイド文字列が「こんにちは」メモリに保存されている期間の値は、次のようにするので、これは、1つの実行された後、明らかに、それが正しい長さを取得していないことを示しています。

48 00 65 00 00 6C 6C 6F 00 00 21 00

strlen文字列の最初の0:00の文字列が終了したと考えられるので、長さは、このいずれかをカウントするためにstrlenを、1として得られた見つけたときに「H」表現0x48の文字があるためです。

 

私たちは、たwcslenワイド文字の長さの計算機能を使用しています。同じこと

関数名

関数原型

機能機能

返却値

wcscat

wchar_t型* wcscat(wchar_t型の* s1を、CONSTはwchar_t * S2)。

接続文字列s1をs2は、後に参照しました

文字列s1の最初のアドレスを参照

wcschr

wchar_t型* wcschr(CONSTのwchar_t *は、wchar_t型のC)。

文字列s中に文字cの最初の出現を検索します

見つかった場合、文字のアドレスが返され、そうでない場合はNULL

wcscmpの

int型wcscmpの(のconst wchar_t型の* s1を、CONSTはwchar_t * S2)。

文字列と比較して、文字列s1のS2をしてみましょう

S1 <S2、負戻り、S1 == S2、0を返し、S1> S2と、正の数を返します

wcscpy

wchar_t型* wcscpy(wchar_t型の* s1を、CONSTはwchar_t * S2)。

S1内の文字列と呼ばs2のカバーをコピーします。

まず、アドレス文字列はS1と呼ば

たwcslen

size_tのたwcslen(のconst wchar_t型の*秒)。

S要件呼ば文字列の長さ

有効な文字の数を返します。

wcsstr

wchar_t型* wcsstr(のconst wchar_t型の* s1を、CONSTはwchar_t * S2)。

s2の最初の出現s1の文字列内の文字列の位置を探します

見つかった場合は、場所のアドレスが返され、そうでない場合はNULLを返します

 

2.2.4ソースコードファイルを維持します

「こんにちは」Lを使用してテキスト回避を使用して直接TEXT(「こんにちは」)

場所のTEXT回顧定義はLを追加することが見出されました

#define TEXT(引用)__TEXT(引用)    // r_winnt 

の#define __TEXT(引用)L ##引用       // r_winnt

そのため、TEXTを使用するか、_TEXTはLに感謝することはできません

 

2.3ワイドおよびWindows

2.3.1 Windowsのヘッダファイルを入力

Windowsプログラムは、ヘッダーファイルWINDOWS.Hが含まれています。文書は、ファイルがWindowsの定義で使用される基本的なパターンの数を有し、WINDEF.H含む他のヘッダファイルの数を含み、それはWINNT.Hを含んでも、それ自体です。WINNT.Hは、基本的なUnicodeサポートを扱います。

wchar_t型の定義を含む多くのCヘッダファイルの一つであるフロントヘッダのctype.hテーブルCを含むWINNT.H。WINNT.HはCHARとWCHARと呼ばれる、新しいデータ型を定義します。

typedefのchar型のCHAR;        
typedefのwchar_t WCHAR。    // トイレ     

 

あなたは8文字または16個の文字を定義する必要がある場合、あなたがWindowsプログラムで使用して、データ型がCHAR WCHARあることをお勧めします。ハンガリー語の表記の後ろに定義WCHARコメントが推奨される:可変基づいWCHARデータパターンは、ワイド文字WCを示すために、文字の前に取り付けられてもよいです。

さらにWINNT.Hヘッダファイルは、文字列データ型に4つの8のconstポインタとして使用される8および6つのデータパターンとして使用する文字列へのポインタを定義します。ここでは、ヘッダの選択は、いくつかの実用的な説明データ・タイプのステートメントをファイル:

CHAR * PCHAR、* LPCH、* PCH、* NPSTR、* LPSTR、*のtypedef PSTR。        
typedefのCONST CHAR * LPCCH、* PCCH、* LPCSTR、* PCSTR。        

 

NとLは、2つのサイズで16ビットのWindows異なる指標を参照すると、「近い」と「長い」接頭辞を表します。Win32の近くと長い指数の違いはありません。

同様に、WINNT.HはCONSTとして、文字列データ型に6つの16ビット・ポインタ、および文字列データ型に4つの16ビットポインタとして定義されます。

typedef WCHAR * PWCHAR、* LPWCH、* PWCH、* NWPSTR、* LPWSTR、* PWSTR。        
typedefのCONST WCHAR * LPCWCH、* PCWCH、* LPCWSTR、* PCWSTR。        

 

この時点で、我々は、CHARとWCHARインジケータにデータタイプCHAR(8ビット文字)とWCHAR(16ビットのwchar_t)、及び点を有します。TCHAR.Hと同じように、WINNT.H TCHARは、一般的な文字タイプとして定義されます。UNICODE定義識別子(ないボトムライン)、およびTCHARを指すTCHARインジケータはWCHARの指標として定義され、WCHARを向いている場合、UNICODE識別子が定義されていない場合、およびTCHAR TCHARインデックスの点は、を指すように、及びチャーのように定義されますchar型の指標:

#ifdefのUNICODE 
WCHAR TCHAR typedefは、 * PTCHAR。
LPWSTR LPTCH、PTCH、PTSTR、LPTSTRのtypedef。
LPCWSTR LPCTSTRのtypedef。      
#elseの
typedefの文字 TCHAR * PTCHAR。  
LPSTR LPTCH、PTCH、PTSTR、LPTSTRのtypedef。
LPCSTR LPCTSTRのtypedef。   
#endifの

あなたは、ヘッダーファイル、または他のヘッダファイルにTCHARデータ型を定義した場合、その後、WINNT.Hとプロトタイプがwchar.hヘッダファイルには、その繰り返しを防ぐために定義することができます。しかし、いつでもプログラムの他のヘッダファイルの使用は、他のWINDOWS.Hヘッダーファイルの前に含めるべきです。

WINNT.Hヘッダーファイルは、また、最初のL-引用符で囲まれた文字列の前に追加のマクロを定義します。UNICODEが定義された識別子である場合は、次のように定義されたマクロ__TEXTと呼ばれています。

#define __TEXT(引用)L ##引用        

__TEXTマクロの定義のように、識別子UNICODEが定義されていない場合:

#define __TEXT(引用)引用        

さらに、TEXTマクロは、このように定義されます:

#define TEXT(引用)__TEXT(引用)        

この方法TCHAR.H _TEXTマクロは同じに定義されていますが、一番下の行を心配する必要はありません。私は本のこのマクロテキストバージョンを使用します。

これらの定義は、同じプログラム内でASCIIとUnicode文字列を混在できるように、またはコンパイルされたプログラムのASCIIまたはUnicodeで書かれていてもよいです。あなたが明示的に8ビットの文字変数と文字列を定義したい場合は、CHAR、PCHAR(またはその他)を使用するだけでなく、引用符で囲まれた文字列。明示的に16ビットの文字変数と文字列を使用するには、WCHAR、PWCHAR、およびLは、引用符の前に追加します。8ビットまたは16ビットの変数またはTCHAR、PTCHARおよびテキストマクロを使用する識別子UNICODE文字列の定義に応じました。

 

2.3.2 Windows関数の呼び出し

MessageBoxA:

WINUSERAPIのINT WINAPI MessageBoxA(HWND hWndは、LPCSTR lpText、
                           LPCSTR lpCaption、UINT uType)。
        

ここMessageBoxWは以下のとおりです。

WINUSERAPI INT WINAPI MessageBoxW(HWND hWndは、LPCWSTR lpText、
        
                           LPCWSTR lpCaption、UINT uType)。

彼らの第二と第三引数は文字列定数ポインタです

メッセージボックスには、パラメータの種類に応じて呼び出されます。

UNICODEの#ifdef
 の#defineのMessageBox MessageBoxW
 の#else 
の#defineのMessageBox MessageBoxA
 #endifの // !UNICODE

 

2.3.3 Windowsの文字列関数

以下は、Windowsによって定義された文字列関数の集合であり、これらの関数は、文字列の長さを計算する文字列をコピーし、接続文字列と比較文字列に使用されます。

さilength = lstrlen(pString)。
        
pString = lstrcpy(pString1、pString2)。
        
pString = lstrcpyn(pString1、pString2、ICOUNT)。
        
pString = lstrcat(pString1、pString2)。
        
ICOMP = lstrcmpを(pString1、pString2)。
        
ICOMP = LSTRCMPI(pString1、pString2)。

これらの機能は、対応するC関数リンクライブラリ関数と同じです。UNICODE識別子が定義されている場合、その関数は、ワイド文字列を受け入れる、または唯一の従来の文字列を受け入れます。機能のLstrlenWワイド文字列バージョンは、Windows 98で実行することができます。

 

Windowsでの2.3.4の使用のprintf

あなたは、Windowsプログラムでprintf関数を使用しますが、他の機能を利用することはできません。

#include <はWindows.h> 
する#include <stdio.hに> 
する#include <STDLIB.H> INT WINAPIのWinMain(HINSTANCE hInstanceは、HINSTANCE hPrevInstance、PSTR szCmdLine、INT iCmdShow)
{ チャー szBuffer [ 100 ]。
    sprintf(szBuffer、" %の合計iと%iはiがn \%である"535 + 3 )。
    メッセージボックス(NULL、szBuffer、TEXT(" Hk_Mayfly ")、0x4L | 0x40L )。リターン0 ; 
}


    

     

 

次の表は、すべてのsprintf関数のMicrosoft CランタイムライブラリとWindowsのサポートを示しています。 

 

ASCII

ワイド文字

従来の

可変パラメータの数

     

スタンダード版

sprintf

swprintf

_stprintf

最大の長さのバージョン

_snprintf

_snwprintf

_sntprintf

Windows版

wsprintfA

wsprintfW

wsprintf

ポインタパラメータ配列

     

スタンダード版

vsprintfの

vswprintf

_vstprintf

最大の長さのバージョン

_vsnprintf

_vsnwprintf

_vsntprintf

Windows版

wvsprintfA

wvsprintfW

wvsprintf

 

2.3.5フォーマットされたメッセージボックス

#include <windows.h>      
#include <tchar.h>          
#include <stdio.h>   
        
int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...)
        
{
        
    TCHAR   szBuffer [1024] ;
        
    va_list pArgList ;
        

    // The va_start macro (defined in STDARG.H) is usually equivalent to:
        
    // pArgList = (char *) &szFormat + sizeof (szFormat) ;
        

    va_start (pArgList, szFormat) ;
        

    // The last argument to wvsprintf points to the arguments
        

    _vsntprintf ( szBuffer, sizeof (szBuffer) / sizeof (TCHAR),
        
                   szFormat, pArgList) ;
        

    // The va_end macro just zeroes out pArgList for no good reason
        
    va_end (pArgList) ;
        
    return MessageBox (NULL, szBuffer, szCaption, 0) ;
        
}
        
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                   PSTR szCmdLine, int iCmdShow)
        
{
        
    int cxScreen, cyScreen ;
        
    cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
        
    cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
        

    MessageBoxPrintf (    TEXT ("ScrnSize"),
        
                   TEXT ("The screen is %i pixels wide by %i pixels high."),
        
                   cxScreen, cyScreen) ;
        
    return 0 ;
        
}

 

おすすめ

転載: www.cnblogs.com/Mayfly-nymph/p/11286296.html