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++]]へ戻る

2013年11月23日 (土) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス