2

一部の環境ではstd::string内部的に UTF-8 を使用していることを読みました。一方、私のプラットフォームである Windows では、std::stringASCII のみです。この動作は、 を使用して変更できますstd::locale。私のバージョンの STL には、文字列で使用する UTF-8 ファセットがないか、少なくとも見つかりません。fstreamただし、一連のクラスで使用するためのファセットがあります。

編集:「内部で UTF-8 を使用する」と言うときstd::basic_filebuf::open()、一部の環境ではUTF-8エンコードされた文字列を受け入れるなどのメソッドを参照しています。これは実際にはstd::string問題ではなく、一部の OS がUTF-8ネイティブで使用していることを知っています。私の質問は、「実装は無効なシーケンスのコード変換をどのように処理しますか?」と読む必要があります。

これらのストリームは、他のプラットフォーム/実装で無効なコード シーケンスをどのように処理しますか?

UTF8 facetの for ファイルでは、単純にエラーが返されるため、それ以上ストリームが読み取られなくなります。エラーを Unicode の "Invalid char" 0xfffd 値に変更する方が良いと思いました。

私の質問は に限定されません。UTF-8無効なUTF-16サロゲート ペアはどうですか?

例を挙げましょう。toUTF-8でエンコードされたファイルを開くとします。無効なシーケンスは実装でどのように処理されますか? または、 aに出力して、今回は単独のサロゲートを使用します。UTF-8wchar_t localeUTF-8std::wstringstd::cout

4

3 に答える 3

4

一部の環境では、std::string が内部的に UTF-8 を使用することを読みました。

C++ プログラムはstd::string、標準準拠のプラットフォームで UTF-8 文字列を保持するために使用することを選択できます。

一方、私のプラットフォームである Windows では、std::string は ASCII のみです。

それは正しくありません。Windows では、必要に応じて を使用しstd::stringて UTF-8 文字列を保持できますがstd::string、標準準拠のプラットフォームでは ASCII を保持することに限定されません。

この動作は、std::locale を使用して変更できます。

いいえ、 の動作はstd::stringロケール ライブラリの影響を受けません。

Astd::stringは のシーケンスですchars。Windows を含むほとんどのプラットフォームでは、acharは 8 ビットです。したがってstd::string、ASCII、Latin1、UTF-8、または 8 ビット以下のコード単位を使用する任意の文字エンコーディングを保持するために使用できます。 std::string::lengthは保持されているコード単位の数を返し、std::string::operator[]は i 番目のコード単位を返します。

char16_tUTF-16 を保持するには、 とを使用できますstd::u16string

char32_tUTF-32 を保持するには、 とを使用できますstd::u32string

于 2013-07-22T15:59:12.410 に答える
1

UTF-8 から wchar_t へのロケールで UTF-8 でエンコードされたファイルを開くとします。無効な UTF-8 シーケンスは実装でどのように処理されますか?

通常、wchar_t他のプラットフォームでワイド char 型に変換したり、他のワイド char 型に変換したりすることはありませんが、これに使用できる標準ファセットはすべて読み取りエラーを通知し、エラーが解消されるまでストリームの動作を停止させます。

于 2013-07-22T16:15:21.493 に答える
0

std::stringhttp://en.cppreference.com/w/cpp/string/basic_string -コードポイント/データを検証しないでください - バイナリデータを格納できるはずです。

エンコーディングが実際に違いを生む唯一の場所は、文字列の長さを計算し、文字列を 1 文字ずつ繰り返し処理する場合です。ロケールは、これらのいずれの場合にも影響しません。

またstd::locale、まったく回避できる場合、の使用はおそらく良い考えではありません。すべてのプラットフォームまたは標準ライブラリのすべての実装でスレッドセーフではないため、使用するときは注意が必要です。この効果も非常に限定的であり、おそらく期待したほどではありません。

于 2013-07-22T15:14:21.817 に答える