最初の質問に対する非常に部分的な答え:ファイルはバイトのシーケンスであるため、'sを処理する場合、との間でwchar_t
少なくともある程度の変換が発生する必要があります。この変換を「インテリジェントに」行うには、文字エンコードの知識が必要です。そのため、ストリームのロケールでファセットを使用することにより、この変換をロケールに依存させることができます。wchar_t
char
次に、問題は、標準で必要とされる唯一のロケールである「クラシック」ロケールでその変換をどのように行うかです。そのための「正しい」答えはありません。したがって、標準はそれについて非常にあいまいです。あなたの質問から、wchar_t[]とchar[]の間で盲目的にキャスト(またはmemcpy()-ing)するのが良い方法だと思い込んでいることを理解しています。これは不合理ではなく、実際、一部の実装で行われている(または少なくとも行われた)ことです。
もう1つのPOVは、codecvtがロケールファセットであるため、「ロケールのエンコーディング」を使用して変換が行われることを期待するのが妥当です(概念がかなりあいまいなので、ここでは手に負えません)。たとえば、トルコ語のロケールではISO-8859-9を使用し、日本語のロケールではShiftJISを使用することが期待されます。同様に、「クラシック」ロケールはこの「ロケールのエンコーディング」に変換されます。どうやら、Microsoftは単純にトリミングすることを選択しました(UTF-16を表し、基本的な多言語面にとどまると仮定すると、IS-8859-1にwchar_t
なります)が、私が知っているLinuxの実装はASCIIに固執することにしました。
2番目の質問:
また、C ++ 0xで実際のUnicodeストリームを取得するのでしょうか、それともここで何かが足りないのでしょうか。
n2857(私が手元にある最新のC ++ 0xドラフト)の[locale.codecvt]セクションでは、次のように読むことができます。
スペシャcodecvt<char16_t, char, mbstate_t>
ライゼーションはUTF-16とUTF-8エンコーディングスキームcodecvt <char32_t, char, mbstate_t>
間で変換され、スペシャライゼーションはUTF-32とUTF-8エンコーディングスキーム間で変換されます。codecvt<wchar_t,char,mbstate_t>
ナロー文字とワイド文字のネイティブ文字セット間で変換します。
[locale.stdcvt]セクションには、次のものがあります。
ファセットの場合codecvt_utf8
:—ファセットは、プログラム内でUTF-8マルチバイトシーケンスとUCS2またはUCS4(Elemのサイズに応じて)の間で変換する必要があります。[...]
ファセットの場合codecvt_utf16
:—ファセットは、プログラム内でUTF-16マルチバイトシーケンスとUCS2またはUCS4(Elemのサイズに応じて)の間で変換する必要があります。[...]
ファセットの場合codecvt_utf8_utf16
:—ファセットは、プログラム内でUTF-8マルチバイトシーケンスとUTF-16(1つまたは2つの16ビットコード)の間で変換する必要があります。
したがって、これは「はい」を意味すると思いますが、確実に「実際のUnicodeストリーム」が何を意味するかについてより正確にする必要があります。