プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

MFCでTCHAR(UNICODE)文字列とchar型文字列を相互変換する。

この記事は2019年01月03日に投稿しました。
この記事は2019年01月31日に更新しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. MFCでTCHAR(UNICODE)文字列とchar型文字列を相互変換する
  3. おわりに

かんたん Visual C++ [改訂2版] (プログラミングの教科書)

かんたん Visual C++ [改訂2版] (プログラミングの教科書)

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. おわりに

以前、

paveway.hatenablog.com

を紹介しました。

別の方法も見つけたので今回紹介します。

標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング (Programmer’s SELECTION)

標準講座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

目次へ