Entry

プログラミングメモ - CString と文字コード変換の話とか

2010年04月16日

かなり長い間 VC6 の環境に浸っていたもんで,ちとリハビリ。なんかこの頃,忘れっぽくなっている。

  // C++ array text
  WCHAR* strUnicode = L"こんにちは世界";
  CHAR* strMultiByte = "こんにちは世界";

  // This CString class below is a CStringW class that
  // operates Unicode (UTF-16) character strings. 
  CString str1(strUnicode);
  CString str2(strMultiByte);

  m_wndEditWString.SetWindowText(str1);
  m_wndEditAString.SetWindowText(str2);

CString で検索すると,CString と char 型をどうやって相互変換するのか,という話がかなりあるわけだけれども,最近の MFC に入っている CString(CStringW)は,コンストラクタで勝手に変換してくれるんですね。昔は,MultiByteToWideChar を自前で呼ばなきゃいけなかったわけだけど。いつの時代だよってなもんですが。

べんりー!ただそれだけ。

【追記】
と,VC6 についてくる CString クラスのコンストラクタに MBCS と Unicode を相互変換する機能はないよ。と書いたんですけど,なんかあったみたい。こんな楽チンだったのか。嘘書いてごめんなさい。

ということで,該当箇所のソース(MFC 6.0)。CString のコンストラクタから呼ばれます。少し体裁を修正しています。

// Multibyte->WideChar
int AFX_CDECL
_mbstowcsz(wchar_t* wcstr, const char* mbstr, size_t count) {
  if (count == 0 && wcstr != NULL) {
    return 0;
  }
  int result = ::MultiByteToWideChar(CP_ACP, 0, mbstr, -1,
    wcstr, count);
  ASSERT(wcstr == NULL || result <= (int)count);
  if (result > 0) {
    wcstr[result-1] = 0;
  }
  return result;
}

// WideChar->Multibyte
int AFX_CDECL
_wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count) {
  if (count == 0 && mbstr != NULL) {
    return 0;
  }
  int result = ::WideCharToMultiByte(CP_ACP, 0, wcstr, -1,
    mbstr, count, NULL, NULL);
  ASSERT(mbstr == NULL || result <= (int)count);
  if (result > 0) {
    mbstr[result-1] = 0;
  }
  return result;
}

ふーん……。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN