文字列の一部をUTF-16に変換したい場合、たとえばchar * xmlbuffer
、UTF-16にエンコードする前にタイプをに変換する必要がありwchar_t *
ますか?またchar*
、UTF-8にエンコードする前に型が必要ですか?
は、 UTF-8、UTF-16、UTF-32、またはその他の変換形式とどのようwchar_t
に関連していますか?char
助けてくれてありがとう!
文字列の一部をUTF-16に変換したい場合、たとえばchar * xmlbuffer
、UTF-16にエンコードする前にタイプをに変換する必要がありwchar_t *
ますか?またchar*
、UTF-8にエンコードする前に型が必要ですか?
は、 UTF-8、UTF-16、UTF-32、またはその他の変換形式とどのようwchar_t
に関連していますか?char
助けてくれてありがとう!
いいえ、データ型を変更する必要はありません。
についてwchar_t
:標準はそれを言います
タイプwchar_tは、サポートされているロケール間で指定された最大の拡張文字セットのすべてのメンバーの個別のコードを値で表すことができる個別のタイプです。
残念ながら、それはエンコーディングが何を持っているべきかについては述べていませんwchar_t
。これは実装に依存します。だから例えば与えられた
auto s = L"foo";
式の値が何であるかについては、まったく仮定できません*s
。
ただし、std::string
任意の変換形式のテキストを問題なく表す不透明なバイトシーケンスとして使用できます。標準のライブラリ文字列関連の操作を実行しないでください。
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);
のサイズwchar_t
はコンパイラに依存するため、さまざまなUnicode形式との関係は異なります。