6

文字列の一部をUTF-16に変換したい場合、たとえばchar * xmlbuffer、UTF-16にエンコードする前にタイプをに変換する必要がありwchar_t *ますか?またchar*、UTF-8にエンコードする前に型が必要ですか?

は、 UTF-8、UTF-16、UTF-32、またはその他の変換形式とどのようwchar_tに関連していますか?char

助けてくれてありがとう!

4

3 に答える 3

5

いいえ、データ型を変更する必要はありません。

についてwchar_t:標準はそれを言います

タイプwchar_tは、サポートされているロケール間で指定された最大の拡張文字セットのすべてのメンバーの個別のコードを値で表すことができる個別のタイプです。

残念ながら、それはエンコーディングが何を持っているべきかについては述べていませんwchar_t。これは実装に依存します。だから例えば与えられた

auto s = L"foo";

式の値が何であるかについては、まったく仮定できません*s

ただし、std::string任意の変換形式のテキストを問題なく表す不透明なバイトシーケンスとして使用できます。標準のライブラリ文字列関連の操作を実行しないでください。

于 2012-05-03T22:10:56.650 に答える
5

iconvは、中間のエンコード手順を処理できるPOSIX関数です。を使用iconv_openして、UTF-8入力があり、UTF-16出力が必要であることを指定できます。次に、から返されたハンドルを使用して、(入力バッファと出力バッファを指定する)iconv_openを使用できます。iconv完了したら、リソースなどを解放するためiconv_closeに返されるハンドルを呼び出す必要があります。iconv_open

どのエンコーディングがサポートされているか、iconvおよびそれらの命名スキーム(つまり、何を提供するかiconv_open)について、システムのドキュメントを熟読する必要があります。たとえば、iconv一部のシステムでは期待し"utf-8"、他のシステムでは期待する場合があります"UTF8"

Windowsはiconvのバージョンを提供せず、代わりに独自のUTFフォーマット関数MultiByteToWideCharおよびWideCharToMultiByteを提供します。

//UTF8 to UTF16
std::string input = ...
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
                                               NULL, 0);
std::wstring output(utf16len);
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
                                &output[0], output.size());
//UTF16 to UTF8
std::wstring input = ...
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
                                              NULL, 0, NULL, NULL);
std::string output(utf8len);
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(),
                                &output[0], output.size(), NULL, NULL);
于 2012-05-03T22:24:50.160 に答える
1

のサイズwchar_tはコンパイラに依存するため、さまざまなUnicode形式との関係は異なります。

于 2012-05-03T22:03:33.447 に答える