このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

エンコーディング変換のWindows API

[追記]詳しいことをシフトJIS文字列とユニコード文字列の変換のときの終端ヌルとかバッファ長とか - 檜山正幸のキマイラ飼育記に書いた。[/追記]

// API

int MultiByteToWideChar(
			UINT CodePage,         // コードページ
			DWORD dwFlags,         // 文字の種類を指定するフラグ
			LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
			int cchMultiByte,      // マップ元文字列のバイト数
			LPWSTR lpWideCharStr,  // マップ先ワイド文字列を入れるバッファのアドレス
			int cchWideChar        // バッファのサイズ
			);

int WideCharToMultiByte(
			UINT CodePage,         // コードページ
			DWORD dwFlags,         // 処理速度とマッピング方法を決定するフラグ
			LPCWSTR lpWideCharStr, // ワイド文字列のアドレス
			int cchWideChar,       // ワイド文字列の文字数
			LPSTR lpMultiByteStr,  // 新しい文字列を受け取るバッファのアドレス
			int cchMultiByte,      // 新しい文字列を受け取るバッファのサイズ
			LPCSTR lpDefaultChar,  // マップできない文字の既定値のアドレス
			LPBOOL lpUsedDefaultChar   // 既定の文字を使ったときにセットするフラグのアドレス
			);

// 使用例

  // ...
  int lengthUnicode =
    MultiByteToWideChar(
			CP_UTF8,
			0,
			srcUTF8.c_str(),
			srcUTF8.
			size() + 1,
			NULL,
			0
			);

  // ...
  MultiByteToWideChar(
		      CP_UTF8,
		      0,
		      srcUTF8.c_str(),
		      srcUTF8.size() + 1,
		      bufUnicode,
		      lenghtUnicode
		      );
  // ...
  int lengthShiiftJis =
    WideCharToMultiByte(
			CP_THREAD_ACP,
			0,
			bufUnicode,
			-1,
			NULL,
			0,
			NULL,
			NULL
			);
  // ...
  WideCharToMultiByte(
		      CP_THREAD_ACP,
		      0,
		      bufUnicode,
		      lenghtUnicode + 1,
		      bufShiftJis,
		      lengthSJis,
		      NULL,
		      NULL
		      );