// wchartToChar.cpp : コンソール アプリケーションのエントリ // ポイントを定義します。 // #include "stdafx.h" #include // wcstombs_s #include // setlocale #include // strlen #include int wchartToChar ( const wchar_t* pSrc , char* pDest , const size_t iDestSize ); int charToWchart ( const char* pSrc , wchar_t* pDest , const size_t sDestSize ); int _tmain( int argc, _TCHAR* argv[] ) { // ロケール指定 setlocale( LC_ALL, "Japanese" ); wchar_t* wcBuf = L"wchar_t メッセージ"; printf( "(1)変換前\n" ); printf( "wchar_t:[%S] len:%d byte:%d\n" , wcBuf , wcslen( wcBuf ) , sizeof( wcBuf ) ); // %sじゃダメ // wchar_t* -> char* char cBuf[(18*2)+1]; // char cBuf[256]; wchartToChar( wcBuf, cBuf, sizeof( cBuf ) ); printf( "(2)wchar_t=>char変換後\n" ); printf( "char :[%s] len:%d byte:%d\n" , cBuf , strlen( cBuf ) , sizeof( cBuf ) ); // char* -> wchar_t* wchar_t wcBuf2[13+1]; printf( "wcBuf2 sizeof=%d\n", sizeof( wcBuf2 ) ); // charToWchart( cBuf, wcBuf2, sizeof( wcBuf2 ) ); // 第3パラメータをsizeof( wcBuf2 )=28にすると // mbstowcs_sでEILSEQエラーが出る。 // あくまで文字数を指定しなければならない。 printf( "cBuf strlen=%d\n", strlen( cBuf ) ); // charToWchart( cBuf, wcBuf2, strlen( cBuf ) ); // strlenはマルチバイト文字を2文字と数える // そのため「wchar_t メッセージ」は18文字となる。 // 第3パラメータに指定するのはあくまでwchar_tの文字数なので // strlen( cBuf )=18もNG。 charToWchart( cBuf, wcBuf2, 13 ); // 第3パラメータの文字数は終端文字も含む? // 13だとエラーになる。 charToWchart( cBuf, wcBuf2, 13+1 ); printf( "(3)char=>wchar_t変換後\n" ); printf( "wchar_t:[%S] len:%d byte:%d\n" , wcBuf2 , wcslen( wcBuf2 ) , sizeof( wcBuf2 ) ); getchar(); return 0; } //============================================================== // [概要] // wchar_t* から char* への変換を行う // [引数] // pSrc const wchar_t* 変換するwchar_t型の文字列。 // pDest char* 変換結果のchar型文字列。 // sDestSize const size_t pDestのサイズ // [戻り値] // int 0:正常,1:異常 //============================================================== int wchartToChar ( const wchar_t* pSrc , char* pDest , const size_t sDestSize ) { size_t iReturnValue; errno_t ret = wcstombs_s( &iReturnValue , pDest , sDestSize , pSrc , _TRUNCATE ); if ( ret != 0 ) { printf( "wcstombs_s error!! ret=%d\n", ret ); return 1; } printf( "wcstombs_s return value(変換された文字数):%d\n" , iReturnValue ); return 0; } //============================================================== // [概要] // char* から wchar_t* への変換を行う // [引数] // pSrc const char* 変換するchar型の文字列。 // pDest wchar_t* 変換結果のwchar_t型文字列。 // sDestSize const size_t pDestのサイズ // [戻り値] // int 0:正常,1:異常 //============================================================== int charToWchart ( const char* pSrc , wchar_t* pDest , const size_t sDestSize ) { printf( "pSrc=[%s] sDestSize=[%d]\n", pSrc, sDestSize ); size_t iReturnValue; errno_t ret = mbstowcs_s( &iReturnValue , pDest , sDestSize , pSrc , _TRUNCATE ); if ( ret != 0 ) { printf( "mbstowcs_s error!! ret=" ); switch( ret ) { case EINVAL: printf( "EINVAL\n" ); break; case ERANGE: printf( "ERANGE\n" ); break; case EILSEQ: printf( "EILSEQ\n" ); break; default: printf( "other[%d]\n", ret ); break; } return 1; } printf( "mbstowcs_s return value(変換された文字数):%d\n" , iReturnValue ); return 0; }