この記事は2019年01月03日に投稿しました。
この記事は2019年01月31日に更新しました。
目次
![かんたん Visual C++ [改訂2版] (プログラミングの教科書) かんたん Visual C++ [改訂2版] (プログラミングの教科書)](https://images-fe.ssl-images-amazon.com/images/I/51kl%2BP4hpkL._SL160_.jpg)
かんたん Visual C++ [改訂2版] (プログラミングの教科書)
- 作者: 堀義博
- 出版社/メーカー: 技術評論社
- 発売日: 2017/10/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているMFCでTCHAR(UNICODE)文字列とchar型文字列を相互変換する方法についてです。
2. MFCでTCHAR(UNICODE)文字列とchar型文字列を相互変換する
MFCでTCHAR(UNICODE)文字列とchar型文字列を相互変換するには、MultiByteToWideChar関数とWideCharToMultiByte関数を使用します。
MultiByteToWideChar
書式
int MutiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar );
引数
CodePage
以下のコードページの定数を指定します。
定数 | 意味 |
---|---|
CP_ACP | ANSIコードページ |
CP_MACCP | Macintoshコードページ |
CP_OEMCP | OEMコードページ |
CP_SYMBOL | シンボルコードページ(42) |
CP_THREAD_ACP | 現在のスレッドのANSI コードページ |
CP_UTF7 | UTF-7を使った変換 |
CP_UTF8 | UTF-8を使った変換 |
dwFlags
一連のビットフラグをセットします。
定数 | 意味 |
---|---|
MB_PRECOMPOSED | 常に構成済み文字(基本文字と送りなし文字の文字値が同じ文字)を使います。 これが既定の変換方法です。MB_COMPOSITE は同時にセットできません。 |
MB_COMPOSITE | 常に合成文字(基本文字と送りなし文字の文字値が異なる文字)を使います。 MB_PRECOMPOSED は同時にセットできません。 |
MB_ERR_INVALID_CHARS | 無効な入力文字があったときは関数が失敗し、GetLastError 関数を呼び出すと ERROR_NO_UNICODE_TRANSLATION が返ります。 |
MB_USEGLYPHCHARS | 制御文字の代わりにグリフ文字を使います。 |
lpMultiByteStr
変換元のchar型文字列(マルチバイト文字列)
cchMultiByte
変換元のchar型文字列(マルチバイト文字列)のバイト数
lpWideCharStr
変換先のTCHAR(UNICODE)(ワイド文字列)を格納するバッファ
cchWideChar
変換先のTCHAR(UNICODE)(ワイド文字列)を格納するバッファのサイズ
戻り値
成功した場合、変換先のバッファに格納された文字数が返却されます。 失敗した場合、0が返却されます。
WideCharToMultiByte
書式
int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar );
引数
CodePage
以下のコードページの定数を指定します。
定数 | 意味 |
---|---|
CP_ACP | ANSIコードページ |
CP_MACCP | Macintoshコードページ |
CP_OEMCP | OEMコードページ |
CP_SYMBOL | シンボルコードページ(42) |
CP_THREAD_ACP | 現在のスレッドのANSI コードページ |
CP_UTF7 | UTF-7を使った変換 |
CP_UTF8 | UTF-8を使った変換 |
dwFlags
定数 | 意味 |
---|---|
WC_NO_BEST_FIT_CHARS | 対応するマルチバイトに直接変換されない Unicode 文字を、既定の文字に変換します(lpDefaultChar パラメータを参照)。 つまり、変換した場合、Unicode 文字列に逆変換しても元の文字列と正確に一致する文字列に戻すことができない文字は、既定の文字に置き換えます。 このフラグは単独で使うことも、他の dwFlags オプションと組み合わせて使うこともできます。 |
WC_COMPOSITECHECK | 合成文字を構成済み文字に変換します。 |
WC_DISCARDNS | 変換時、送りなし文字を破棄します。 |
WC_SEPCHARS | 変換時、別々の文字を生成します。これは、既定の変換動作です。 |
WC_DEFAULTCHAR | 変換時、例外を既定の文字に置き換えます。 |
lpWideCharStr
変換元のTCHAR(UNICODE)文字列(ワイド文字列)
cchWideChar
変換元のTCHAR(UNICODE)文字列(ワイド文字列)の文字数
-1を指定した場合、自動計算されます。
lpMultiByteStr
変換先のchar型文字列(マルチバイト文字列)のバッファ
cchMultiByte
変換先のchar型文字列(マルチバイト文字列)のバッファのバイト数
0を指定した場合、バッファに必要なバイト数が設定されます。
この場合、バッファは設定されません。
lpDefaultChar
変換できない文字の既定文字
NULLを指定した場合、システム既定値が使用されます。
lpUsedDefaultChar
変換できない文字の既定文字を使用した時のフラグ
NULLを指定可能です。
戻り値
成功した場合、変換先のバッファに格納されたバイト数が返却されます。 失敗した場合、0が返却されます。
実装例
char型文字列→TCHAR(UNICODE)文字列
#include <Windows.h> #define DST_LEN (256) char src[] = "Sample"; TCHAR dst[DST_LEN]; ZeroMemory(&dst[0], DST_LEN); MutiByteToWideChar(CP_ACP, 0, &src[0], sizeof(src), &dst[0], DST_LEN);
TCHAR(UNICODE)文字列→char型文字列
#include <Windows.h> #define DST_LEN (256) TCHAR* src = _T("Sample"); char dst[DST_LEN]; ZeroMemory(&dst[0], DST_LEN); WideCharToMultiByte(CP_ACP, 0, &src[0], lstrlen(src), &dst[0], DST_LEN, NULL, NULL);
3. おわりに
以前、
を紹介しました。
別の方法も見つけたので今回紹介します。

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング (Programmer’s SELECTION)
- 作者: ハーバートシルト,田中正造,Herbert Schildt,コスモワークス
- 出版社/メーカー: 翔泳社
- 発売日: 1999/04/01
- メディア: 単行本
- 購入: 11人 クリック: 39回
- この商品を含むブログ (4件) を見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688