19

C11 と C++11 は両方ともuchar.h/cucharヘッダー定義char16_tを導入し、char32_t明示的に 16 および 32 ビット幅の文字として、リテラル構文u""を追加U""し、これらの文字タイプの文字列をマクロとともに書き込むため、それらが UTF-16 に対応しているかどうかを示します__STDC_UTF_16____STDC_UTF_32__および UTF-32 コード単位。wchar_tこれは、一部のプラットフォームでは 16 ビットであり、一般に UTF-16 コード単位を保持するために使用され、一部のプラットフォームでは 32 ビットであり、一般に UTF-32 コード単位を保持するために使用される に関するあいまいさを取り除くのに役立ちます。これらのマクロが設定されていると仮定すると、UTF-16 および UTF-32 を参照する移植可能な明確なコードを記述できるようになります。__STDC_ISO_10646__かどうかを判断するためのプロキシとしても使用できます。wchar_tUTF-32 値を保持できます。それができない場合は、UTF-16 を保持していると必ずしも仮定することはできませんが、おそらく、移植性に十分に近い近似値です。

また、マルチバイト文字とこれらの型を変換する関数mbrtoc16mbrtoc32c16rtomb、も追加されています。c32rtombこれらと既存mbstowcsの関数ファミリの間で、UTF-16、UTF-32、プラットフォームのマルチバイト文字セット、およびプラットフォームのワイド文字セットの間で移植可能に変換できます (ただし、プラットフォームで定義されたマルチバイトおよびワイド文字セットが使用されない限り、必ずしもロスレスではありません)。 UTF; 特に、これらの関数は、ロケール定義のマルチバイト エンコーディングが 1 文字あたり 2 バイトを超える使用を許可されていない Windows ではほとんど役に立たないようです)。

さらに、u8""リテラル UTF-8 でエンコードされた文字列を記述するための構文を追加しました。char *UTF-8 はおよびを扱うほとんどの関数と互換性のあるエンコーディングであるためstd::string、これは最も便利な新しい追加機能の 1 つです。

ただし、UTF-8、UTF-16、および UTF-32 の間で移植可能な変換を行う方法を追加できていないようです。mbtoc16および関連する関数は、実装定義のマルチバイト エンコーディングと UTF-16 または 32 の間で変換を行います。ただし、これが UTF-8 であることに依存することはできません。Unix ライクなプラットフォームでは、ロケールに依存しており、それらの多くはデフォルトでロケールで UTF-8 を使用しています。デフォルトでなくても、知る目的で少なくともロケールを UTF-8 ロケールに設定できます。その「マルチバイト」はUTF-8を意味します。ただし、Windows では、locale に 2 バイト以上を必要とする UTF-8 やその他のエンコーディングを明示的に使用することはできません

それとも、UTF-8 文字列型には、他の型の文字列 (プラットフォーム定義のマルチバイト、プラットフォーム定義のワイド文字、UTF-16、または UTF-32) に変換する方法がありませんか? システムのマルチバイト エンコーディングが UTF-8 かどうかを判断する方法さえありませんか? このサポートが含まれていない理由はありますか (具体的には、憶測だけでなく、C または C++ 標準委員会による実際に書かれた正当化または議論を探しています)。この状況を改善するために行われている作業はありますか? 今後改善される可能性はありますか?

または、ポータブルな方法で UTF-8 をサポートしたい場合、独自の実装を作成したり、ライブラリの依存関係を取り入れたり、 や などのプラットフォーム固有の関数を使用したりする場合に、現在の最適なソリューションはiconvありMultiByteToWideCharますか?

4

1 に答える 1

1

std::codecvtタイプを探しているようです。使用方法については、そのページの例を参照してください。

于 2013-10-29T03:41:22.450 に答える