C 日本語文字列 新しいページはコチラ
提供: yonewiki
(ページの作成:「※このページではC言語にも存在していたという意味で記事タイトルがC 日本語文字列になっていますが、<br /> C++で...」) |
|||
27行: | 27行: | ||
統一まではできないかと思います。<br /> | 統一まではできないかと思います。<br /> | ||
でも一番いいのはこれってのはあります。でも、それはそれで、「そんなことせなあかんの?話が違う、帰るわ!」って思われるかもしれません。<br /> | でも一番いいのはこれってのはあります。でも、それはそれで、「そんなことせなあかんの?話が違う、帰るわ!」って思われるかもしれません。<br /> | ||
− | + | <br /> | |
+ | == '''マルチバイト文字列、ワイド文字列''' == | ||
+ | *マルチバイト文字列<br /> | ||
+ | マルチバイト文字列はchar型でやってきたこと。<br /> | ||
+ | *ワイド文字列<br /> | ||
+ | 固定の2byte以上のメモリ空間に英数字ascii範囲とか関係なくすべて同じ固定の領域に格納する方法。デメリットとしては、文字列でメモリ空間をかなり無駄にしてしまうということ。<br /> | ||
+ | あえて英数字のみ対応のアプリを作るのは、このデメリットと引き換えにして、メモリの節約をしていることになります。それか面倒だから、asciiコードのみ対応にしたとか…。<br /> | ||
+ | でも、言いにくいことなんですけど…、いろんな方式をいろんな人が使っている昨今でして、全体的に網羅しておかないと変換とかしないとダメなので、覚えることが多いのも事実です。<br /> | ||
+ | Unicodeって言う方式もこれです。<br /> | ||
+ | VisualSutdioのプロジェクトの設定でもUnicode文字列とマルチバイト文字列、どっちも使わないってのが設定できます。<br /> | ||
+ | VisualStudioをアクティブにしている状態で[Alt]+[F7]でプロジェクトのプロパティが表示されるダイアログが表示されます。<br /> | ||
+ | そうするとTCHAR型という文字列変数がマルチバイトおよびUnicodeを判別してコンパイルしてくれます。<br /> | ||
+ | 因みにワイド文字列型では、wchar_t型というのを使うのですが、TCHAR型が、これに置き換わることになります。<br /> | ||
+ | <br /> | ||
+ | ワイド文字列では、文字列リテラルへは L("yonewiki") としなければならないし、<br /> | ||
+ | 例えば文字列を引数にする関数もwprintf(L("cStr=%s"),cStr );とかに多数の書き換えが必要になります。<br /> | ||
+ | そして、ワイド文字がどこの国の言葉を扱うのかを定義するには、<br /> | ||
+ | setlocale関数で設定が必要で、<br /> | ||
+ | setlocale( LC_ALL, "Japanese" );<br /> | ||
+ | ちなみに関数のリファレンスはmsdnが最強だと思うわけでして、<br /> | ||
+ | C++Runtimeリファレンス<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/634ca0c2(v=vs.90).aspx<br /> | ||
+ | setlocale<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/x99tb11d(v=vs.90).aspx<br /> | ||
+ | といった記述が必要になる。setlocale関数を使うには#include<locale.h>が必要です。<br /> | ||
+ | さらにwcher_t型を使うには、プリプロセッサでwchar.hを読み込まなくてはならず、<br /> | ||
+ | <nowiki>#include<wchar.h></nowiki>と記述しないといけないです。<br /> | ||
+ | 従って、 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <iostream> | ||
+ | #include<locale.h> | ||
+ | #include<wchar.h> | ||
+ | int main() { | ||
+ | setlocale( LC_ALL, "Japanese" ); | ||
+ | wchar_t cStr[]=L("よねウィキyonewiki"); | ||
+ | wprintf(L("cStr0=%s sizeof=%d StrCount=%d"), cStr0,sizeof(cStr0),wcslen(cStr0)); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | <br /> | ||
+ | TCHAR型も同じようなものですが、プロジェクトの設定次第で置き換わるということが特徴です。<br /> | ||
+ | これでプロジェクトの設定をUnicodeの文字セットにしていれば、wchar_t型になり、<br /> | ||
+ | さらにTCHAR型を使うには、プリプロセッサでtchar.hを読み込まなくてはならず、<br /> | ||
+ | <nowiki>#include<tchar.h></nowiki>と記述しないといけないです。<br /> | ||
+ | 従って、 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <iostream> | ||
+ | #include<locale.h> | ||
+ | #include<tchar.h> | ||
+ | int main() { | ||
+ | setlocale( LC_ALL, "Japanese" ); | ||
+ | TCHAR cStr0[]=_T("よねウィキyonewiki"); | ||
+ | _tprintf(_T("cStr0=%s sizeof=%d StrCount=%d"), cStr0,sizeof(cStr0),_tcslen(cStr0)); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | 出力結果は | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | cStr0=よねウィキyonewiki sizeof=28 StrCount=13 | ||
+ | </syntaxhighlight> | ||
+ | となります。 | ||
+ | あんまり変わり映えしませんが、プロジェクトの設定に従うという意味ではTCHAR型を使うのが少しお勧めです。<br /> | ||
+ | <br /> | ||
+ | WindowsのVisualStudioなどでWin32 APIを使える環境であれば、以下のような型もあります。<br /> | ||
+ | LPCSTR =const CHAR * <br /> | ||
+ | LPCWSTR=const WCHAR *<br /> | ||
+ | LPCTSTR=const TCHAR * <br /> | ||
+ | LPSTR =CHAR *<br /> | ||
+ | LPWSTR =WCHAR * <br /> | ||
+ | LPTSTR =TCHAR *<br /> | ||
+ | それぞれの正式な名称は <br /> | ||
+ | Long Pointer to Constant null-terminated STRing<br /> | ||
+ | Long Pointer to Constant null-terminated Wide STRing<br /> | ||
+ | Long Pointer to Constant null-terminated Template STRing<br /> | ||
+ | Long Pointer to null-terminated STRing<br /> | ||
+ | Long Pointer to null-terminated Wide STRing<br /> | ||
+ | Long Pointer to null-terminated Template STRing<br /> | ||
+ | であり、その略の型名が対応しているとのこと。<br /> | ||
+ | PCSTR/PCWSTR/PCTSTR/PSTR/PWSTR/PTSTRと先頭にLが着かないものはWin16時代に使われたものですが、今では差がありません。<br /> | ||
+ | <br /> | ||
+ | MFC(MicrosoftFaundationClass)というMicrosoftが提供しているクラスの文字列型には<br /> | ||
+ | 文字列の操作を強化したCStringもあります。有名なので手ごわいですが、これはMFCです。<br /> | ||
+ | MFCは無料では配られていないクラスライブラリでして、Microsoftが定義した型ってのはすごく一般的にも使われるくらい流行します。<br /> | ||
+ | ということで、使うべき型は、WIN32 APIでもLPCTSTR/PCTSTRあるいはLPTSTR/PTSTRということになりましょうか。<br /> | ||
+ | とはいっても、世界中にはいろんな型の文字列で操作されますので、いろいろな変換が必要になります。<br /> | ||
+ | <br /> | ||
+ | == '''マルチバイト文字列、ワイド文字列の相互変換''' == |