34

私は本でこれに出くわしました:

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

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

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

それで、違いは何ですか。「ワイド文字列」は初めて聞きました。文字列をそのまま出力するRaw String Literalsと呼ばれるものを聞いたことがありますが(エスケープシーケンスなどは必要ありません)、Cにはありませんでした.

4

2 に答える 2

46

ワイド文字の正確な性質は、(意図的に) 実装定義のままです。

彼らが最初に の概念を発明したときwchar_t、ISO 10646 と Unicode はまだ互いに競合していました (現在ではほとんどが協力しています)。国際文字がどちらか一方 (またはまったく別のもの) になると宣言しようとするのではなく、選択した国際文字セットをサポートするために実装で定義できる型 (およびいくつかの関数) を提供するだけでした。

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

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

ただし、その保証はありません。少なくとも理論的には、Linux での実装では 16 ビットを使用するか、Windows での実装では 32 ビットを使用するか、64 ビットの使用を決定することができます (ただし、実際にそれを見ると少し驚かれることでしょう)。

いずれにせよ、物事がどのように機能するかについての一般的な考えはwchar_tコードポイントを表すには単一で十分であるということです。I/O の場合、データは外部表現 (それが何であれ) からwchar_ts に変換されることを意図しています。次に、出力中に、選択したエンコーディングに再び変換されます (これは、読み取ったエンコーディングとはまったく異なる場合があります)。

于 2012-07-02T02:45:05.220 に答える
8

「ワイド文字列」とは、文字列内の文字のエンコードを指します。

ウィキペディアから:

ワイド文字は、通常、従来の 8 ビット文字よりもサイズが大きいコンピューター文字データ型です。データ型のサイズが大きくなったため、より大きなコード化文字セットを使用できます。

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

さらに、Microsoftによってデータ オブジェクトとしてwchar_t定義されています。これは、他のオペレーティング システムまたは言語では異なる定義である可能性があり、その可能性が最も高いです。unsigned short(16-bit)

以下のコメントのウィキペディアの記事から引用:

「wchar_t の幅はコンパイラ固有であり、8 ビットまで小さくすることができます。したがって、C または C++ コンパイラ間で移植可能にする必要があるプログラムは、Unicode テキストの格納に wchar_t を使用しないでください。wchar_t 型は、コンパイラの格納を目的としています-一部のコンパイラでは Unicode 文字である可能性があるワイド文字を定義しました。」

于 2012-07-02T02:32:19.517 に答える