C++ワイド文字とショート文字変換

3906 ワード

0x01.幅の狭い文字
短い文字とは、8 bitで表す文字で、典型的な応用はASCIIコードである.ワイド文字は、その名の通り、16 bitで表される文字で、典型的にはUNICodeがある.Windowsの下のASCIIとUNICODのもっと多くの情報について、この2冊の経典の著作を参考にすることができます:《windowsプログラムの設計》、《windowsコアのプログラミング》.この2冊の本はこの2つの文字について比較的詳細な解説がある.
変換する必要があるマルチバイト文字列です.
char sText[20] = {"      !OK!"};

変換後のワイド文字にどれだけの配列空間が必要かを知る必要がある.このマイルでは、20*2の幅の文字の配列を直接定義することができ、実際には非常に楽に動作します.しかし、マルチバイト文字列がより多く、数千個から数万個に達すると、無駄なメモリがますます多くなることがわかります.したがって、マルチバイト文字の個数の2倍をワイド文字配列の下付きとする宣言は決して良いアイデアではない.幸いなことに、必要な配列空間を特定することができる.MultiByteToWideChar()の4番目のパラメータを-1に設定するだけで、必要な短い文字配列空間の数を返します.
DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);

次に、応答の配列空間を割り当てるだけです.
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
  delete []pwText;
}

次に、変換に着手することができます.ここでは、ASCIIコードへの変換を例に挙げます.
MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);

最後に、使用済みのメモリを解放することを忘れないでください.
delete []psText;

同様に、ワイド文字をマルチバイト文字に変換するコードは次のとおりです.
wchar_t wText[20] = {L"       !OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
    delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
delete []psText;

0x02.幅の広い文字と狭い文字の相互変換:
void TCharToChar(const TCHAR* tchar, char* _char)
{
    int iLength;
    iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);
    WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL); 
}


void CharToTchar (const char * _char, TCHAR * tchar)
{
    int iLength ; 
    iLength = MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, NULL, 0) ; 
    MultiByteToWideChar (CP_ACP, 0, _char, strlen (_char) + 1, tchar, iLength) ; 
}