* 文字コード変換 [#y5632853]
 
 ** コード [#md2b97c3]
 
 *** ワイド文字列をマルチバイト文字列に変換 [#g67f0ce1]
 
 [[WideCharToMultiByte():http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_widechartomultibyte.htm]]
 
  例)
  
 	wchar_t sText = L"いろはに";
 	char	sDest [256];
 
 	DWORD	dwLen = WideCharToMultiByte(
 			CP_ACP,
 			0,
 			(LPCWSTR)sText,
 			-1,
 			NULL,
 			0,
 			NULL,
 			NULL
 			);
 
 	WideCharToMultiByte(
 			CP_ACP,
 			0,
 			(LPCWSTR)sText,
 			-1,
 			sDest,
 			dwLen,
 			NULL,
 			NULL);
 
 	sDest[dwLen] = '\0';
 
 [[wcstombs():http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_wcstombs.htm]] は、内部で WideCharToMultiByte() を呼び出している。
 
 	ex.)
 	
 	int mbs_len = wcstombs( NULL, msg, 0 );
 	char * mbs = new char [mbs_len + 1];
 	try {
 		wcstombs( mbs, msg, mbs_len + 1 );
 	} catch (...) {
 	}
 	delete mbs;
 
 *** マルチバイト文字列をワイド文字列に変換 [#uab5f524]
 
 [[MultiByteToWideChar():http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_multibytetowidechar.htm]]
 
 
 [[mbtowc():http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_mbtowc.htm]] は、内部で MultiByteToWideChar() を呼び出している。
 
 
 ** メモ [#g42eee42]
 
 *** Unicode [#yb423d28]
 
 とりあえず、[[Wikipedia の説明:http://ja.wikipedia.org/wiki/Unicode]] 。
 
 ちなみに、UTF-16 と UTF-32 には、先頭 2byte に BOM(Byte Order Mark) というモノがついてくることがある。ここには、その文字コードが LE(little endian) なのか BE(big endian) なのかを区別するための情報が書き込まれる。
 ちなみに、UTF-16 と UTF-32 には、先頭 2byte に BOM(Byte Order Mark) というモノがついてくることがある。ここには、その文字コードが LE(little endian/FFFE) なのか BE(big endian/FEFF) なのかを区別するための情報が書き込まれる。
 
 ところで、本来 BOM が必要ない(LE/BE の区別がない)はずの UTF-8 にも BOM がつくことがある。私は、その文字コードが UTF-8 であるかどうかを識別するためだけに使うものと解釈してるんだけど、ちとよく解ってない。
 
 
 *** C++ 環境依存 [#racbab40]
 wchar_t という型は「ワイド文字」と呼ばれるが、これは環境によって実装がことなる模様。
 
 VC++ (Win32 環境?)&br;
 wchar_t は 2byte, サロゲートペア部分を取り除いたBOMなしの UTF-16(BE)
 
 UTF-16 には BE(big endian) と LE(little endian) の2種類があるが、
 Windows 環境 (LE) の ワイド文字がなぜ UTF-16BEなのかは謎。
 
 gcc (大抵の unix 環境)&br;
 wchar_t は 4byte, 文字コードは UCS4。
 
 *** VC++ の罠 [#f266565c]
 VC++ では、コンパイラの設定によって、
 デフォルトでマルチバイト文字セットを使うか、
 Unicode を使うか、という設定がある。
 VC++.NET 2003 なら、プロジェクトのプロパティの[構成プロパティ]の[全般]の[文字セット] 。
 
 _T というマクロは、文字列を環境デフォルトに変換するマクロ。
 
  _T("あいうえお");
 
 マルチバイトをデフォルトにしているが、ワイド文字列として扱いたい場合は、
 
  L"あいうえお"
 
 とする。
 
 
 *** 文字列は必ず [#r23a71f9]
 
 文字列を、バイト配列や vector で扱うときは、 null(0) 終端すると確実。&br;
 (std::string はどうなんだろう)&br;
 
  char str [16];
  
  	...
  
  str [15] = '\0';
 
  std::vector<char> str;
  
  	...
  
  str.push_back( 0 );
 
 
 C/C++ の文字列のお約束。
 
 
 -----
 [[MLEXP. Wiki]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS