C 日本語文字列 新しいページはコチラ
提供: yonewiki
(→マルチバイト文字列、ワイド文字列の相互変換) |
(→マルチバイト文字列、ワイド文字列の相互変換) |
||
314行: | 314行: | ||
UnicodeとShift_JISの変換もここで知っておくべきか…。<br /> | UnicodeとShift_JISの変換もここで知っておくべきか…。<br /> | ||
つうか、この記事、長すぎっ。誰も理解できないんじゃね?って思う今日この頃。<br /> | つうか、この記事、長すぎっ。誰も理解できないんじゃね?って思う今日この頃。<br /> | ||
+ | <br /> | ||
+ | とかいいつつ、サンプルプログラムを作りました。<br /> | ||
+ | mbstowcs関数とwcstombs関数はやはり、mbstowcs_s関数とwcstombs_s関数があって更には、<br /> | ||
+ | 個別にlocale設定するmbstowcs_s_l関数とwcstombs_s_l関数もありました。詳しくはmsdnのリファレンスのとおりです。<br /> | ||
+ | *mbstowcs_s/mbstowcs_s_l<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/vstudio/eyktyxsx(v=vs.110).aspx<br /> | ||
+ | *wcstombs_s/wcstombs_s_l<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/vstudio/s7wzt4be(v=vs.110).aspx<br /> | ||
+ | サンプルプログラムは以下のとおりです。<br /> | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <iostream> | ||
+ | //#include<locale.h> tchar.hがインクルードされていれば、いらない。 | ||
+ | #include<tchar.h> | ||
+ | int main() { | ||
+ | _tsetlocale( LC_ALL, _T("Japanese")); | ||
+ | size_t requiredSize = 0; | ||
+ | size_t *sizeReturnValue; | ||
+ | sizeReturnValue = new size_t; | ||
+ | *sizeReturnValue=0; | ||
+ | size_t sizecStr0=0; | ||
+ | _tprintf(_T("%s\n"),cStr); | ||
+ | const TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | ||
+ | const char *cStr1[]={"表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"}; | ||
+ | |||
+ | TCHAR **pcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)]; | ||
+ | char **pcStr1 = new char*[sizeof(cStr0)/sizeof(*cStr0)]; | ||
+ | TCHAR **pcStr2 = new TCHAR*[sizeof(cStr1)/sizeof(*cStr1)]; | ||
+ | |||
+ | //マルチバイト文字→ワイド文字変換 | ||
+ | _tprintf(_T("マルチバイト文字→ワイド文字変換\n")); | ||
+ | for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | ||
+ | printf("\n"); | ||
+ | printf("cStr1=%s sizeof=%d StrCount=%d\n", cStr1[i], sizeof(cStr1)/sizeof(*cStr1),strlen(cStr1[i])); | ||
+ | mbstowcs_s(sizeReturnValue, NULL, 0,cStr1[i], 0); | ||
+ | requiredSize = *sizeReturnValue; | ||
+ | pcStr2[i] = new TCHAR[requiredSize]; | ||
+ | printf("requiredSize=%d,cStr0=%s\n", requiredSize,*(cStr1 + i)); | ||
+ | mbstowcs_s(sizeReturnValue, pcStr2[i], requiredSize, cStr1[i], requiredSize); | ||
+ | printf("sizeReturnValue=%d\n\n",*sizeReturnValue); | ||
+ | for(unsigned int j = 0; j < requiredSize; j++){ | ||
+ | printf("pcStr2[%d][%2d]=%x\n",i,j,*(*(pcStr2 + i) + j)); | ||
+ | } | ||
+ | } | ||
+ | printf("\n"); | ||
+ | for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | ||
+ | _tprintf(_T("_tcslen(cStr1[i])=%d\npcStr2=%s\n"), strlen(cStr1[i]), *(pcStr2 + i)); | ||
+ | printf(" cStr1=%s\n\n", *(cStr1 + i)); | ||
+ | } | ||
+ | |||
+ | //ワイド文字変換→マルチバイト文字 | ||
+ | _tprintf(_T("ワイド文字変換→マルチバイト文字\n")); | ||
+ | for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | ||
+ | sizecStr0 = 0; | ||
+ | _tprintf(_T("cStr0=%s sizeof=%d StrCount=%d\n"), cStr0[i], sizeof(cStr0)/sizeof(*cStr0),_tcslen(cStr0[i])); | ||
+ | wcstombs_s(sizeReturnValue, NULL, 0,cStr0[i],0); | ||
+ | requiredSize = *sizeReturnValue; | ||
+ | pcStr1[i] = new char[requiredSize]; | ||
+ | _tprintf(_T("requiredSize=%d, cStr0=%s\n"),requiredSize,*(cStr0 + i)); | ||
+ | wcstombs_s(sizeReturnValue, pcStr1[i], requiredSize, cStr0[i],requiredSize); | ||
+ | printf("sizeReturnValue=%d\n\n",*sizeReturnValue); | ||
+ | for(unsigned int k = 0; k < requiredSize; k++){ | ||
+ | printf("pcStr1[%d][%2d]=%x\n",i,k,*(*(pcStr1 + i) + k)); | ||
+ | } | ||
+ | } | ||
+ | for(int i = 0; i < 3; i++){ | ||
+ | _tprintf(_T("_tcslen(cStr0[i])=%d\npcStr0=%s\n"),_tcslen(cStr0[i]),*(cStr0 + i)); | ||
+ | printf(" cStr1=%s\n\n",*(pcStr1 + i)); | ||
+ | } | ||
+ | for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | ||
+ | delete[] *(pcStr0 + i); | ||
+ | } | ||
+ | for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | ||
+ | delete[] *(pcStr1 + i); | ||
+ | } | ||
+ | for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | ||
+ | delete[] *(pcStr2 + i); | ||
+ | } | ||
+ | delete[] pcStr0; | ||
+ | delete[] pcStr1; | ||
+ | delete[] pcStr2; | ||
+ | delete sizeReturnValue; | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | 前半部分にマルチバイト文字→ワイド文字変換<br /> | ||
+ | 後半部分にワイド文字→マルチバイト文字変換<br /> | ||
+ | の処理を記述しました。<br /> | ||
+ | mbstowcs_s(sizeReturnValue, NULL, 0,cStr1[i], 0);<br /> | ||
+ | のように第二引数には本来、変換後の文字列の先頭アドレスを記述しますが、NULLと指定して、<br /> | ||
+ | 第三引数の変換後の配列要素数も0にして、第四引数に変換元の文字列の先頭アドレスを記述し、変換する要素数も0を指定すると<br /> | ||
+ | size_t型のポインタ変数sizeReturnValueに変換に必要な配列サイズが返ってきます。<br /> | ||
+ | その返却された値を<br /> | ||
+ | requiredSize = *sizeReturnValue;のようにしてコピーしておいて、<br /> | ||
+ | mbstowcs_s(sizeReturnValue, pcStr2[i], requiredSize, cStr1[i], requiredSize);<br /> | ||
+ | とすることで変換がされます。<br /> | ||
+ | 逆のwcstombs_sも同様です。やったことないようなプログラムでしたので、たまには、こうして確かめてみるのも良いですね。<br /> | ||
+ | <br /> | ||
+ | ちょっと出力結果に冗長さを設定したサンプルプログラムなので、<br /> | ||
+ | 以下のように出力が長くなりましたが、全部貼っておきます。<br /> | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | マルチバイト文字→ワイド文字変換 | ||
+ | |||
+ | cStr1=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=32 | ||
+ | requiredSize=22,cStr0=表示:よねウィキの機能<yonewiki> | ||
+ | sizeReturnValue=22 | ||
+ | |||
+ | pcStr2[0][ 0]=8868 | ||
+ | pcStr2[0][ 1]=793a | ||
+ | pcStr2[0][ 2]=ff1a | ||
+ | pcStr2[0][ 3]=3088 | ||
+ | pcStr2[0][ 4]=306d | ||
+ | pcStr2[0][ 5]=30a6 | ||
+ | pcStr2[0][ 6]=30a3 | ||
+ | pcStr2[0][ 7]=30ad | ||
+ | pcStr2[0][ 8]=306e | ||
+ | pcStr2[0][ 9]=6a5f | ||
+ | pcStr2[0][10]=80fd | ||
+ | pcStr2[0][11]=3c | ||
+ | pcStr2[0][12]=79 | ||
+ | pcStr2[0][13]=6f | ||
+ | pcStr2[0][14]=6e | ||
+ | pcStr2[0][15]=65 | ||
+ | pcStr2[0][16]=77 | ||
+ | pcStr2[0][17]=69 | ||
+ | pcStr2[0][18]=6b | ||
+ | pcStr2[0][19]=69 | ||
+ | pcStr2[0][20]=3e | ||
+ | pcStr2[0][21]=0 | ||
+ | |||
+ | cStr1=表示:よねウィキの機能1<yonewiki> sizeof=3 StrCount=33 | ||
+ | requiredSize=23,cStr0=表示:よねウィキの機能1<yonewiki> | ||
+ | sizeReturnValue=23 | ||
+ | |||
+ | pcStr2[1][ 0]=8868 | ||
+ | pcStr2[1][ 1]=793a | ||
+ | pcStr2[1][ 2]=ff1a | ||
+ | pcStr2[1][ 3]=3088 | ||
+ | pcStr2[1][ 4]=306d | ||
+ | pcStr2[1][ 5]=30a6 | ||
+ | pcStr2[1][ 6]=30a3 | ||
+ | pcStr2[1][ 7]=30ad | ||
+ | pcStr2[1][ 8]=306e | ||
+ | pcStr2[1][ 9]=6a5f | ||
+ | pcStr2[1][10]=80fd | ||
+ | pcStr2[1][11]=31 | ||
+ | pcStr2[1][12]=3c | ||
+ | pcStr2[1][13]=79 | ||
+ | pcStr2[1][14]=6f | ||
+ | pcStr2[1][15]=6e | ||
+ | pcStr2[1][16]=65 | ||
+ | pcStr2[1][17]=77 | ||
+ | pcStr2[1][18]=69 | ||
+ | pcStr2[1][19]=6b | ||
+ | pcStr2[1][20]=69 | ||
+ | pcStr2[1][21]=3e | ||
+ | pcStr2[1][22]=0 | ||
+ | |||
+ | cStr1=表示:よねウィキの機能2<yonewiki> sizeof=3 StrCount=33 | ||
+ | requiredSize=23,cStr0=表示:よねウィキの機能2<yonewiki> | ||
+ | sizeReturnValue=23 | ||
+ | |||
+ | pcStr2[2][ 0]=8868 | ||
+ | pcStr2[2][ 1]=793a | ||
+ | pcStr2[2][ 2]=ff1a | ||
+ | pcStr2[2][ 3]=3088 | ||
+ | pcStr2[2][ 4]=306d | ||
+ | pcStr2[2][ 5]=30a6 | ||
+ | pcStr2[2][ 6]=30a3 | ||
+ | pcStr2[2][ 7]=30ad | ||
+ | pcStr2[2][ 8]=306e | ||
+ | pcStr2[2][ 9]=6a5f | ||
+ | pcStr2[2][10]=80fd | ||
+ | pcStr2[2][11]=32 | ||
+ | pcStr2[2][12]=3c | ||
+ | pcStr2[2][13]=79 | ||
+ | pcStr2[2][14]=6f | ||
+ | pcStr2[2][15]=6e | ||
+ | pcStr2[2][16]=65 | ||
+ | pcStr2[2][17]=77 | ||
+ | pcStr2[2][18]=69 | ||
+ | pcStr2[2][19]=6b | ||
+ | pcStr2[2][20]=69 | ||
+ | pcStr2[2][21]=3e | ||
+ | pcStr2[2][22]=0 | ||
+ | |||
+ | _tcslen(cStr1[i])=32 | ||
+ | pcStr2=表示:よねウィキの機能<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能<yonewiki> | ||
+ | |||
+ | _tcslen(cStr1[i])=33 | ||
+ | pcStr2=表示:よねウィキの機能1<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能1<yonewiki> | ||
+ | |||
+ | _tcslen(cStr1[i])=33 | ||
+ | pcStr2=表示:よねウィキの機能2<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能2<yonewiki> | ||
+ | |||
+ | ワイド文字変換→マルチバイト文字 | ||
+ | cStr0=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=21 | ||
+ | requiredSize=33, cStr0=表示:よねウィキの機能<yonewiki> | ||
+ | sizeReturnValue=33 | ||
+ | |||
+ | pcStr1[0][ 0]=ffffff95 | ||
+ | pcStr1[0][ 1]=5c | ||
+ | pcStr1[0][ 2]=ffffff8e | ||
+ | pcStr1[0][ 3]=ffffffa6 | ||
+ | pcStr1[0][ 4]=ffffff81 | ||
+ | pcStr1[0][ 5]=46 | ||
+ | pcStr1[0][ 6]=ffffff82 | ||
+ | pcStr1[0][ 7]=ffffffe6 | ||
+ | pcStr1[0][ 8]=ffffff82 | ||
+ | pcStr1[0][ 9]=ffffffcb | ||
+ | pcStr1[0][10]=ffffff83 | ||
+ | pcStr1[0][11]=45 | ||
+ | pcStr1[0][12]=ffffff83 | ||
+ | pcStr1[0][13]=42 | ||
+ | pcStr1[0][14]=ffffff83 | ||
+ | pcStr1[0][15]=4c | ||
+ | pcStr1[0][16]=ffffff82 | ||
+ | pcStr1[0][17]=ffffffcc | ||
+ | pcStr1[0][18]=ffffff8b | ||
+ | pcStr1[0][19]=40 | ||
+ | pcStr1[0][20]=ffffff94 | ||
+ | pcStr1[0][21]=5c | ||
+ | pcStr1[0][22]=3c | ||
+ | pcStr1[0][23]=79 | ||
+ | pcStr1[0][24]=6f | ||
+ | pcStr1[0][25]=6e | ||
+ | pcStr1[0][26]=65 | ||
+ | pcStr1[0][27]=77 | ||
+ | pcStr1[0][28]=69 | ||
+ | pcStr1[0][29]=6b | ||
+ | pcStr1[0][30]=69 | ||
+ | pcStr1[0][31]=3e | ||
+ | pcStr1[0][32]=0 | ||
+ | cStr0=表示:よねウィキの機能1<yonewiki> sizeof=3 StrCount=22 | ||
+ | requiredSize=34, cStr0=表示:よねウィキの機能1<yonewiki> | ||
+ | sizeReturnValue=34 | ||
+ | |||
+ | pcStr1[1][ 0]=ffffff95 | ||
+ | pcStr1[1][ 1]=5c | ||
+ | pcStr1[1][ 2]=ffffff8e | ||
+ | pcStr1[1][ 3]=ffffffa6 | ||
+ | pcStr1[1][ 4]=ffffff81 | ||
+ | pcStr1[1][ 5]=46 | ||
+ | pcStr1[1][ 6]=ffffff82 | ||
+ | pcStr1[1][ 7]=ffffffe6 | ||
+ | pcStr1[1][ 8]=ffffff82 | ||
+ | pcStr1[1][ 9]=ffffffcb | ||
+ | pcStr1[1][10]=ffffff83 | ||
+ | pcStr1[1][11]=45 | ||
+ | pcStr1[1][12]=ffffff83 | ||
+ | pcStr1[1][13]=42 | ||
+ | pcStr1[1][14]=ffffff83 | ||
+ | pcStr1[1][15]=4c | ||
+ | pcStr1[1][16]=ffffff82 | ||
+ | pcStr1[1][17]=ffffffcc | ||
+ | pcStr1[1][18]=ffffff8b | ||
+ | pcStr1[1][19]=40 | ||
+ | pcStr1[1][20]=ffffff94 | ||
+ | pcStr1[1][21]=5c | ||
+ | pcStr1[1][22]=31 | ||
+ | pcStr1[1][23]=3c | ||
+ | pcStr1[1][24]=79 | ||
+ | pcStr1[1][25]=6f | ||
+ | pcStr1[1][26]=6e | ||
+ | pcStr1[1][27]=65 | ||
+ | pcStr1[1][28]=77 | ||
+ | pcStr1[1][29]=69 | ||
+ | pcStr1[1][30]=6b | ||
+ | pcStr1[1][31]=69 | ||
+ | pcStr1[1][32]=3e | ||
+ | pcStr1[1][33]=0 | ||
+ | cStr0=表示:よねウィキの機能2<yonewiki> sizeof=3 StrCount=22 | ||
+ | requiredSize=34, cStr0=表示:よねウィキの機能2<yonewiki> | ||
+ | sizeReturnValue=34 | ||
+ | |||
+ | pcStr1[2][ 0]=ffffff95 | ||
+ | pcStr1[2][ 1]=5c | ||
+ | pcStr1[2][ 2]=ffffff8e | ||
+ | pcStr1[2][ 3]=ffffffa6 | ||
+ | pcStr1[2][ 4]=ffffff81 | ||
+ | pcStr1[2][ 5]=46 | ||
+ | pcStr1[2][ 6]=ffffff82 | ||
+ | pcStr1[2][ 7]=ffffffe6 | ||
+ | pcStr1[2][ 8]=ffffff82 | ||
+ | pcStr1[2][ 9]=ffffffcb | ||
+ | pcStr1[2][10]=ffffff83 | ||
+ | pcStr1[2][11]=45 | ||
+ | pcStr1[2][12]=ffffff83 | ||
+ | pcStr1[2][13]=42 | ||
+ | pcStr1[2][14]=ffffff83 | ||
+ | pcStr1[2][15]=4c | ||
+ | pcStr1[2][16]=ffffff82 | ||
+ | pcStr1[2][17]=ffffffcc | ||
+ | pcStr1[2][18]=ffffff8b | ||
+ | pcStr1[2][19]=40 | ||
+ | pcStr1[2][20]=ffffff94 | ||
+ | pcStr1[2][21]=5c | ||
+ | pcStr1[2][22]=32 | ||
+ | pcStr1[2][23]=3c | ||
+ | pcStr1[2][24]=79 | ||
+ | pcStr1[2][25]=6f | ||
+ | pcStr1[2][26]=6e | ||
+ | pcStr1[2][27]=65 | ||
+ | pcStr1[2][28]=77 | ||
+ | pcStr1[2][29]=69 | ||
+ | pcStr1[2][30]=6b | ||
+ | pcStr1[2][31]=69 | ||
+ | pcStr1[2][32]=3e | ||
+ | pcStr1[2][33]=0 | ||
+ | _tcslen(cStr0[i])=21 | ||
+ | pcStr0=表示:よねウィキの機能<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能<yonewiki> | ||
+ | |||
+ | _tcslen(cStr0[i])=22 | ||
+ | pcStr0=表示:よねウィキの機能1<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能1<yonewiki> | ||
+ | |||
+ | _tcslen(cStr0[i])=22 | ||
+ | pcStr0=表示:よねウィキの機能2<yonewiki> | ||
+ | cStr1=表示:よねウィキの機能2<yonewiki> | ||
+ | </syntaxhighlight> | ||
+ | ってな感じになります。マルチバイト文字に変換することでShift_JIS cp932になっていることもわかったかと思います。<br /> | ||
+ | 人に見せるのに、出力部分の適当さ加減はすごいね。でも、これって内部的な努力は凄いけど、外部から見れば何も変化を感じないので、<br /> | ||
+ | さみしいね。次は文字列の操作の記事でも書きます。<br /> | ||
<br /> | <br /> | ||
[[C PlusPlus|C++]]へ戻る | [[C PlusPlus|C++]]へ戻る |