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

提供: yonewiki
移動: 案内, 検索
 
1行: 1行:
 +
[[C PlusPlus#Cにもあった技術|C++]]へ戻る
 +
 +
 
※このページではC言語にも存在していたという意味で記事タイトルがC 日本語文字列になっていますが、<br />
 
※このページではC言語にも存在していたという意味で記事タイトルがC 日本語文字列になっていますが、<br />
 
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br />
 
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br />
40行: 43行:
  
  
VisualSutdioのプロジェクトの設定でもUnicode文字列とマルチバイト文字列、どっちも使わないってのが設定できます。VisualStudioをアクティブにしている状態で[Alt]+[F7]でプロジェクトのプロパティが表示されるダイアログが表示されます。左側のツリー構造から構成プロパティの中の全般を選択すると右側のビュー表示されるリストに文字セットというのがあります。リストには「Unicode文字セットを使用する/マルチバイト文字セットを使用する/設定なし」の3つがあり、ここで選択した設定にしたがって、Visual C++だけの機能になりますが、TCHAR型という文字列変数を定義することで、設定にしたがって、マルチバイトおよびUnicodeを判別してコンパイルしてくれます。因みにワイド文字列型では、wchar_t型というのを使うのですが、TCHAR型は、Unicode設定だとwchar_tに置き換わることになります。<br />
+
VisualSutdioのプロジェクトの設定でもUnicode文字列とマルチバイト文字列、どっちも使わないってのが設定できます。VisualStudioをアクティブにしている状態で[Alt]+[F7]でプロジェクトのプロパティが表示されるダイアログが表示されます。左側のツリー構造から構成プロパティの中の全般を選択すると右側のビュー表示されるリストに文字セットというのがあります。リストには「Unicode文字セットを使用する/マルチバイト文字セットを使用する/設定なし」の3つがあり、ここで選択した設定にしたがって、Visual C++だけの機能になりますが、TCHAR型という文字列変数を定義することで、設定にしたがって、マルチバイトおよびUnicodeを判別してコンパイルしてくれます。因みにワイド文字列型では、wchar_t型というのを使うのですが、TCHAR型は、Unicode設定だとwchar_tに置き換わることになります。
 +
 
 +
 
 +
どっちも使わない、設定なしを選択した方がよい場合もあります。それはワイド文字、Unicodeとか、マルチバイト文字を使わないアプリ構成にしたい場合です。Windows.hで提供されるようなAPIでさえも文字列を引数にとることはありますが、この引数の受け取り方が設定なしの場合、なにかとchar型のままでいいよ。という具合になります。そうするとwchar型とかtchar型を使わなくてもよいので、ひたすら文字列はchar型のみを扱えばよいことになります。最初のうちは英語のみ対応のアプリにして練習するのもありかなと思いますので、設定なしという道もあっていいかと思います。むしろ学術的なことに専念するアプリやそういった専門書なんかでは、設定なしを使って説明されるパターンがあります。これは文字列うんぬんを語ると限られたページの中で専門的なことが説明できなくなるからだと思います。ここで書いたことを知っていればあとで、ワイド文字対応に応用することなんかは簡単なことですから、別の専門的なことを勉強するにあたっては、設定なしを選択して、英語版アプリ(1バイト文字、ASCIIコード範囲)を作る覚悟で取り組むということもあっていいかと思います。      
  
  
ワイド文字列では、文字列リテラルへは L("yonewiki") としなければならないし、例えば文字列を引数にする関数もwprintf(L("cStr=%s"),cStr );とかに多数の書き換えが必要になります。そして、ワイド文字がどこの国の言葉を扱うのかを定義するには、setlocale関数で設定が必要で、setlocale( LC_ALL, "Japanese" );※リテラルの設定では省略されていますが、setlocale( LC_ALL, "Japanese_Japan.932" ); />
+
ワイド文字列では、文字列リテラルへは 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 />
  
56行: 62行:
  
  
_wsetlocale( LC_ALL, L("Japanese") );<br />
+
_wsetlocale( LC_ALL, L"Japanese" );<br />
  
  
71行: 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がインクルードされていれば、いらない。
 
#include<wchar.h>
 
#include<wchar.h>
 
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 />
92行: 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がインクルードされていれば、いらない。
101行: 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 />
187行: 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がインクルードされていれば、いらない。
211行: 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 />
  
221行: 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>
242行: 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>
266行: 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 />
  
288行: 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がインクルードされていれば、いらない。
362行: 368行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
前半部分にマルチバイト文字→ワイド文字変換<br />
 
前半部分にマルチバイト文字→ワイド文字変換<br />
 
後半部分にワイド文字→マルチバイト文字変換<br />
 
後半部分にワイド文字→マルチバイト文字変換<br />
380行: 386行:
 
<br />
 
<br />
 
ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br />
 
ちょっと出力結果に冗長さを設定したサンプルプログラムなので、以下のように出力が長くなりましたが、全部貼っておきます。<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
マルチバイト文字→ワイド文字変換
 
マルチバイト文字→ワイド文字変換
  
603行: 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 />
 
さみしいね。次は文字列の操作の記事でも書きます。<br />
 
さみしいね。次は文字列の操作の記事でも書きます。<br />
 
<br />
 
<br />
[[C PlusPlus|C++]]へ戻る
+
 
 +
 
 +
[[C PlusPlus#Cにもあった技術|C++]]へ戻る

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



個人用ツール
名前空間

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