2012-07-02 34 views
19

私は本の中でこの出くわし:C言語の「ワイド文字列」とは何ですか?

wscanf(L"%lf", &variable); 

最初のパラメータはwchar_t *の型です。

これは、最初のパラメータがchar *scanf("%lf", &variable);とは異なります。

だから違いは何ですか。私はかつて "ワイド文字列"を聞いたことがない。文字列をそのまま出力しているもの(エスケープシーケンスのようなものは必要ありませんが)はC言語ではない文字列を聞いたことがあります。

+5

ここから始めよう。 –

+3

最初のパラメータは実際には 'wchar_t []'型で、 'wchar_t * 'と微妙に異なっている。 – dreamlax

答えて

29

正確なは、(意図的に)左の実装が定義されています。

wchar_tのコンセプトを最初に発明したとき、ISO 10646とUnicodeはまだ競合していました(しかし、現在はほとんど協力しています)。国際的なキャラクターが(あるいは多分何か他のものであっても)国際的なキャラクターになると主張するのではなく、彼らが選んだ国際キャラクターセットをサポートするためにインプリメンテーションが定義できるタイプ(そしていくつかの機能)を提供しただけです。

異なる実装のバリエーションの可能性があります。たとえば、Windows上でMicrosoftのコンパイラを使用している場合、wchar_tはUTF-16 Unicode(元々UCS-2 Unicodeを保持していましたが、現在は正式に廃止されています)を保持する16ビット型になります。

Linuxの場合、wchar_tは、UCS-4/UTF-32でエンコードされたUnicodeを保持する32ビットタイプです。 gccと他の少なくともいくつかのオペレーティングシステムのポートは同じですが、常にそうであることを確認しようとはしませんでした。

ただし、その保証はありません。少なくとも論理的には、Linuxでの実装では16ビット、Windowsでは32ビット、64ビットであればどちらかを選択できます(現実には少し驚きます)。

いずれにしても、の目的はとなりますが、コードポイントを表現するにはwchar_tで十分です。 I/Oの場合、データは外部表現(それが何であれ)wchar_tに変換されることが意図されています(これにより、操作が比較的容易になります)。次に出力中に、それらは再びあなたの選択したエンコーディングに変換されます(これはあなたが読み込んだエンコーディングとはまったく異なる場合があります)。

+0

を読んで、他の非Linux Unixをどうですか?また、これはLinuxではなくglibcのプロパティですか? –

+0

私が言ったように、いいえ、それは保証されません: "理論的には、Linuxでの実装は16ビットを使うことができます"。 Linux以外のUnixでは、私は最近知的にコメントするのに十分なほど見ていません。 –

7

「ワイド文字列」は、文字列Wikipediaから

ワイド文字は、一般的に、従来の8ビット文字よりも大きい サイズを持つコンピュータの文字データ型です。増加した データ型サイズは、より大きなコード化文字セットの使用を可能にする。

は、最も一般的に使用されるワイド文字エンコーディングの1つです。

さらに、wchar_tは、unsigned short(16-bit)データオブジェクトとしてMicrosoftで定義されます。これは他のオペレーティングシステムや言語では異なる可能性があります。以下のコメントからWikipediaの記事からの引用

:。

「コンパイラ固有であり、8ビット な限り小さくすることができたwchar_tの幅を任意のC間で移植する必要がありますその結果、プログラムまたは C++コンパイラはUnicodeテキストの格納にwchar_tを使用しないでください。 wchar_t型は、コンパイラ定義のワイド文字を格納するためのものです。 は一部のコンパイラではUnicode文字です。

+1

Wikipediaによると、移植性がない:http://en.wikipedia.org/wiki/Wide_character – nhahtdh

+0

答えをありがとう。 – quantum231

+0

@ quantum231、wikiの答えは実際にはMSFTの場合にのみ当てはまります。 Jerryの答えとTheJoelのブログ記事 –

関連する問題