3

ロケールに関するこの質問から拡張し、この質問
説明しました: 私が本当にやりたかったのは、UTF-16 ファイルを理解するロケールに codecvt ファセットをインストールすることでした。

自分で書くことができました。しかし、私は UTF の専門家ではないので、ほぼ正しいと確信しています。しかし、それは最も不便な時期に壊れます。それで、C++ から使用できるビルド前の codecvt (またはその他の) ファセットの (Web 上に) リソースがあり、ピア レビューおよびテストされているかどうか疑問に思っていました。

その理由は、ファイルを読み取るときにデフォルトのロケール (私のシステム MAC OS X 10.6) が変換なしで 1 バイトを 1 wchar_t に変換するためです。したがって、UTF-16 でエンコードされたファイルは、多くの null ('\0') 文字を含む wstring に変換されます。

4

2 に答える 2

0

C++11 では、さまざまな UTF -xと UCS xの文字シーケンスcodecvt間の変換を目的とした追加の標準の特殊化と型があります。これらのいずれかがニーズに合う場合があります。

<locale>

  • std::codecvt<char16_t, char, std::mbstate_t>: UTF-16 と UTF-8 の間で変換します。
  • std::codecvt<char32_t, char, std::mbstate_t>: UTF-32 と UTF-8 の間で変換します。

<codecvt>

  • std::codecvt_utf8_utf16<typename Elem>: UTF-8 と UTF-16 の間で変換します。ここで、UTF-16 コード ポイントは指定されたとおりに格納されます(が指定されている場合、 ごとに 1 つのコード ポイントのみが格納されることにElem注意してください)。 char32_tchar32_t
    • 2 つの追加の既定のテンプレート パラメータ ( unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。
  • std::codecvt_utf8<typename Elem>Elem: ( の場合は UCS2 、 の場合char16_tは UCS4 、 の場合char32_tはプラットフォームに依存)に応じて、UTF-8 と UCS2 または UCS4 のいずれかとの間で変換しwchar_tます。
    • 2 つの追加の既定のテンプレート パラメータ ( unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。
  • std::codecvt_utf16<typename Elem>Elem: ( の場合は UCS2 、 の場合char16_tは UCS4 、 の場合char32_tはプラットフォームに依存)に応じて、UTF-16 と UCS2 または UCS4 のいずれかとの間で変換しwchar_tます。
    • 2 つの追加の既定のテンプレート パラメータ ( unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。

codecvt_utf8codecvt_utf16サイズに応じて、指定された UTF と UCS2 または UCS4 の間で変換されますElem したがって、wchar_t16 ~ 31 ビットのシステム (16 ビットの Windows など) では UCS2 を指定し、少なくとも 32 ビットのシステム (32 ビットの Linux など) では UCS4 を指定します。wchar_t文字列が実際にそのエンコーディングを使用するかどうかに関係なく; 文字列に異なるエンコーディングを使用するプラットフォームでwchar_tは、注意しないと当然問題が発生します。

詳細については、CPP リファレンスを参照してください。

ヘッダーのサポートcodecvtが追加されたのはlibstdc++比較的最近であることに注意してください。古いバージョンの Clang または GCC を使用している場合は、使用する必要がある場合がありlibc++ます。2015 より前のバージョンの Visual Studio は、実際にはand を
サポートしていないことに注意してください。これらの型が以前のバージョンに存在する場合は、それぞれおよびの typedef になります。また、古いバージョンの Visual Studio では、UTF エンコーディング間で文字列を変換する際に問題が発生する場合があり、Visual Studio 2015 には、とが正しく機能しない不具合があり、代わりに同じサイズの整数型を使用する必要があることに注意してください。char16_tchar32_tunsigned shortunsigned intcodecvtchar16_tchar32_t

于 2016-12-27T22:18:45.937 に答える