C 日本語文字列 新しいページはコチラ
提供: yonewiki
49行: | 49行: | ||
− | ワイド文字列では、文字列リテラルへは L | + | ワイド文字列では、文字列リテラルへは L"yonewiki" としなければならないし、例えば文字列を引数にする関数もwprintf(L"cStr=%s",cStr );とかに多数の書き換えが必要になります。そして、ワイド文字がどこの国の言葉を扱うのかを定義するには、setlocale関数で設定が必要で、setlocale( LC_ALL, "Japanese" );※リテラルの設定では省略されていますが、setlocale( LC_ALL, "Japanese_Japan.932" ); /> |
と設定していることになります。出力するときには日本語のShift_JISにしてねということです。今はWindowsPCのコマンドプロンプトで動作を確認しているからです。<br /> | と設定していることになります。出力するときには日本語のShift_JISにしてねということです。今はWindowsPCのコマンドプロンプトで動作を確認しているからです。<br /> | ||
62行: | 62行: | ||
− | _wsetlocale( LC_ALL, L | + | _wsetlocale( LC_ALL, L"Japanese" );<br /> |
77行: | 77行: | ||
− | < | + | <syntaxhighlight2 lang="cpp" line start="1"> |
#include <iostream> | #include <iostream> | ||
//#include<locale.h> wchar.hがインクルードされていれば、いらない。 | //#include<locale.h> wchar.hがインクルードされていれば、いらない。 | ||
#include<wchar.h> | #include<wchar.h> | ||
int main() { | int main() { | ||
− | _wsetlocale( LC_ALL, L | + | _wsetlocale( LC_ALL, L"Japanese"); |
− | wchar_t cStr[]=L | + | wchar_t cStr[]=L"よねウィキyonewiki"; |
− | wprintf(L | + | wprintf(L"cStr0=%s sizeof=%d StrCount=%d", cStr0,sizeof(cStr0),wcslen(cStr0)); |
} | } | ||
− | </ | + | </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 /> | ||
− | < | + | <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)); | ||
} | } | ||
− | </ | + | </syntaxhighlight2> |
出力結果は | 出力結果は | ||
− | < | + | <syntaxhighlight2 lang="cpp" line start="1"> |
cStr0=表示:よねウィキの機能<yonewiki> sizeof=44 StrCount=21 | cStr0=表示:よねウィキの機能<yonewiki> sizeof=44 StrCount=21 | ||
− | </ | + | </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 /> | ||
− | < | + | <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; | ||
} | } | ||
− | </ | + | </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 /> | ||
− | < | + | <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> | ||
− | </ | + | </syntaxhighlight2> |
となります。<br /> | となります。<br /> | ||
ワイド文字列設定なら<br /> | ワイド文字列設定なら<br /> | ||
− | < | + | <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> | ||
− | </ | + | </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 /> | ||
− | < | + | <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; | ||
} | } | ||
− | </ | + | </syntaxhighlight2> |
前半部分にマルチバイト文字→ワイド文字変換<br /> | 前半部分にマルチバイト文字→ワイド文字変換<br /> | ||
後半部分にワイド文字→マルチバイト文字変換<br /> | 後半部分にワイド文字→マルチバイト文字変換<br /> | ||
386行: | 386行: | ||
<br /> | <br /> | ||
ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br /> | ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br /> | ||
− | < | + | <syntaxhighlight2 lang="cpp"> |
マルチバイト文字→ワイド文字変換 | マルチバイト文字→ワイド文字変換 | ||
609行: | 609行: | ||
pcStr0=表示:よねウィキの機能2<yonewiki> | pcStr0=表示:よねウィキの機能2<yonewiki> | ||
cStr1=表示:よねウィキの機能2<yonewiki> | cStr1=表示:よねウィキの機能2<yonewiki> | ||
− | </ | + | </syntaxhighlight2> |
ってな感じになります。マルチバイト文字に変換することでShift_JIS cp932になっていることもわかったかと思います。<br /> | ってな感じになります。マルチバイト文字に変換することでShift_JIS cp932になっていることもわかったかと思います。<br /> | ||
人に見せるのに、出力部分の適当さ加減はすごいね。でも、これって内部的な努力は凄いけど、外部から見れば何も変化を感じないので、<br /> | 人に見せるのに、出力部分の適当さ加減はすごいね。でも、これって内部的な努力は凄いけど、外部から見れば何も変化を感じないので、<br /> |