C 日本語文字列 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(マルチバイト文字列、ワイド文字列)
 
77行: 77行:
  
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> wchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> wchar.hがインクルードされていれば、いらない。
83行: 83行:
 
int main() {
 
int main() {
 
     _wsetlocale( LC_ALL, L"Japanese");
 
     _wsetlocale( LC_ALL, L"Japanese");
     wchar_t cStr[]=L("よねウィキyonewiki");
+
     wchar_t cStr[]=L"よねウィキyonewiki";
     wprintf(L("cStr0=%s sizeof=%d StrCount=%d"), cStr0,sizeof(cStr0),wcslen(cStr0));
+
     wprintf(L"cStr0=%s sizeof=%d StrCount=%d", cStr0,sizeof(cStr0),wcslen(cStr0));
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
<br />
 
<br />
 
TCHAR型も同じようなものですが、プロジェクトの設定次第で置き換わるということが特徴です。これでプロジェクトの設定をUnicodeの文字セットにしていれば、wchar_t型になり、さらにTCHAR型を使うには、プリプロセッサでtchar.hを読み込まなくてはならず、<br />
 
TCHAR型も同じようなものですが、プロジェクトの設定次第で置き換わるということが特徴です。これでプロジェクトの設定をUnicodeの文字セットにしていれば、wchar_t型になり、さらにTCHAR型を使うには、プリプロセッサでtchar.hを読み込まなくてはならず、<br />
98行: 98行:
 
<br />
 
<br />
 
従って、TCHAR版のプログラムは以下のようになります。<br />
 
従って、TCHAR版のプログラムは以下のようになります。<br />
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
107行: 107行:
 
     _tprintf(_T("cStr0=%s sizeof=%d StrCount=%d"), cStr0,sizeof(cStr0),_tcslen(cStr0));
 
     _tprintf(_T("cStr0=%s sizeof=%d StrCount=%d"), cStr0,sizeof(cStr0),_tcslen(cStr0));
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果は
 
出力結果は
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=44 StrCount=21
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=44 StrCount=21
</syntaxhighlight>
+
</syntaxhighlight2>
 
となります。
 
となります。
 
TCHAR型のユニコード(UTF-16)設定にした場合、wchar_t型のcStr0は配列番号0~21の22の大きさを持つ配列になります。Unicode文字セットですのでShft_JISとは異なる数値が使われますが、0番から順に<br />
 
TCHAR型のユニコード(UTF-16)設定にした場合、wchar_t型のcStr0は配列番号0~21の22の大きさを持つ配列になります。Unicode文字セットですのでShft_JISとは異なる数値が使われますが、0番から順に<br />
193行: 193行:
  
 
を単純にpcStr0というポインタ変数を使って、まるまるコピーする場合はこんな風に自分ならやります。動的にメモリを確保してもらいますが、それで効率が本当にいいのか悪いのかは知りません。なんとなくやりきった感じだけはします。<br />
 
を単純にpcStr0というポインタ変数を使って、まるまるコピーする場合はこんな風に自分ならやります。動的にメモリを確保してもらいますが、それで効率が本当にいいのか悪いのかは知りません。なんとなくやりきった感じだけはします。<br />
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
217行: 217行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
本当は12行目のコピーをする関数である_tcscpy_s関数は語尾の_sの無い関数を使いたいところですが、warningが表示されるので、あえて使いこなします。_tcscpy_sの第一引数はコピー先のTCHAR型先頭アドレスでコピーするのに必要な配列の大きさを持っていれば良いです。第二引数では、コピー先の配列の大きさを指定しています。第三引数はコピー元のTCHAR型の先頭アドレスです。<br />
 
本当は12行目のコピーをする関数である_tcscpy_s関数は語尾の_sの無い関数を使いたいところですが、warningが表示されるので、あえて使いこなします。_tcscpy_sの第一引数はコピー先のTCHAR型先頭アドレスでコピーするのに必要な配列の大きさを持っていれば良いです。第二引数では、コピー先の配列の大きさを指定しています。第三引数はコピー元のTCHAR型の先頭アドレスです。<br />
  
227行: 227行:
 
18行目、20行目では、delete演算子で動的生成した領域の放棄を宣言して、リソースを返却します。使い終わったら速やかに、返す。<br />
 
18行目、20行目では、delete演算子で動的生成した領域の放棄を宣言して、リソースを返却します。使い終わったら速やかに、返す。<br />
 
出力結果はマルチバイト文字設定だと<br />
 
出力結果はマルチバイト文字設定だと<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=32
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=32
 
cStr0=表示:よねウィキの機能<yonewiki>
 
cStr0=表示:よねウィキの機能<yonewiki>
248行: 248行:
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
  cStr0=表示:よねウィキの機能2<yonewiki>
 
  cStr0=表示:よねウィキの機能2<yonewiki>
</syntaxhighlight>
+
</syntaxhighlight2>
 
となります。<br />
 
となります。<br />
 
ワイド文字列設定なら<br />
 
ワイド文字列設定なら<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=21
 
cStr0=表示:よねウィキの機能<yonewiki> sizeof=3 StrCount=21
 
sizecStr0=0,cStr0=表示:よねウィキの機能<yonewiki>
 
sizecStr0=0,cStr0=表示:よねウィキの機能<yonewiki>
272行: 272行:
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
  cStr0=表示:よねウィキの機能2<yonewiki>
 
  cStr0=表示:よねウィキの機能2<yonewiki>
</syntaxhighlight>
+
</syntaxhighlight2>
 
となります。Visual C++をつかわれているのであれば、プロジェクトの設定をマルチバイトにしたり、Unicodeにしてみたりして下さい。TCHAR型で記述しているので、どちらでも動作すると思います。<br />
 
となります。Visual C++をつかわれているのであれば、プロジェクトの設定をマルチバイトにしたり、Unicodeにしてみたりして下さい。TCHAR型で記述しているので、どちらでも動作すると思います。<br />
  
294行: 294行:
 
http://msdn.microsoft.com/ja-jp/library/vstudio/s7wzt4be(v=vs.110).aspx<br />
 
http://msdn.microsoft.com/ja-jp/library/vstudio/s7wzt4be(v=vs.110).aspx<br />
 
サンプルプログラムは以下のとおりです。<br />
 
サンプルプログラムは以下のとおりです。<br />
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
368行: 368行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
前半部分にマルチバイト文字→ワイド文字変換<br />
 
前半部分にマルチバイト文字→ワイド文字変換<br />
 
後半部分にワイド文字→マルチバイト文字変換<br />
 
後半部分にワイド文字→マルチバイト文字変換<br />
386行: 386行:
 
<br />
 
<br />
 
ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br />
 
ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
マルチバイト文字→ワイド文字変換
 
マルチバイト文字→ワイド文字変換
  
609行: 609行:
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
pcStr0=表示:よねウィキの機能2<yonewiki>
 
  cStr1=表示:よねウィキの機能2<yonewiki>
 
  cStr1=表示:よねウィキの機能2<yonewiki>
</syntaxhighlight>
+
</syntaxhighlight2>
 
ってな感じになります。マルチバイト文字に変換することでShift_JIS cp932になっていることもわかったかと思います。<br />
 
ってな感じになります。マルチバイト文字に変換することでShift_JIS cp932になっていることもわかったかと思います。<br />
 
人に見せるのに、出力部分の適当さ加減はすごいね。でも、これって内部的な努力は凄いけど、外部から見れば何も変化を感じないので、<br />
 
人に見せるのに、出力部分の適当さ加減はすごいね。でも、これって内部的な努力は凄いけど、外部から見れば何も変化を感じないので、<br />

2020年9月11日 (金) 00:00時点における最新版



個人用ツール
名前空間

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