2012-03-15 18 views
7

異なるエンコーディングを理解するためにいくつか質問があります。C/C++エンコーディングの質問

文字列のデフォルトのエンコーディングは何ですか?

char ascii[]= "Some text"; // This is plain ASCII right? 
wchar_t utf[] = L"Some Text"; // Is this UTF-16? Or ASCII stored in wchar_t's? 
MessageBoxW(NULL, L"Hello", L"HI", MB_OK); // What encodings are the 2 strings in? 

次に、UTF-8文字列を作成するにはどうすればよいですか? MessageBoxにUTF-8文字を表示したいのですか?

私の質問は主にWindowsで行われますが、異なるOSで異なる場合は、私が知りたいと思っています。

答えて

9

標準では、狭い文字列または広い文字列のエンコードが指定されていません。ベンダーは、通常、ターゲットマシンで驚くことではないものを目指しますが、それ以上のことは言い難いです。これは、例えば、狭い文字列はほとんどのパーソナル・コンピューターでASCII(または実際にはISO-8859のようなもの)を使用しますが、IBMメインフレーム上ではEBCDICを使用することを意味します。

ワイド文字列もさまざまです。たとえば、WindowsのほとんどのコンパイラではUTF-16が使用されます。 Linuxでは、おそらくUTF-32/UCS-4が一般的です。

MessageBoxの言葉は、(あなたが推測したように)あなたが通常はワイド文字列のためのUTF-16を持つWindowsを示唆しています。この場合、ワイド文字列を明示的に指定する場合は、関数のワイドバージョン(MessageBoxW)を明示的に指定する必要があります。

UTF-8文字列リテラルを作成する限り、私が言うことができるのは「幸運」です。それを行うにはVisual Studioまでになるだろうが、そうするための方法があれば、私はそれを認識していない。

+2

C++ x11は、UTF-8文字列リテラルの 'u8'プレフィックスを追加します。たとえば、' u8 "Hello World" 'ですが、C++コンパイラベンダーがC++ x11を採用するまで、UTF代わりに-8文字列を手動で入力します。例えば、コードページ65001で 'WideCharToMultiByte()'を使って実行時に、またはUTF-8オクテット値を含む 'char []'リテラルを使ってコンパイル時に実行します。 –