Unicode 文字列型間の変換
さまざまなプログラミング言語やプラットフォームを使用する場合、Unicode 文字列型間の変換というタスクが発生することがあります。 mbstowcs() や wcstombs() のような関数は変換に有効なオプションのように見えるかもしれませんが、その使用法には問題が生じる可能性があります。
mbstowcs() と wcstombs() の制限
これらの関数は、必ずしも UTF-16 または UTF-32 に変換されるわけではなく、ロケールに基づいて異なるエンコーディングを使用して wchar_t に変換されます。これにより、移植性と Unicode サポートに問題が生じます。
C 11 で導入されたより良いメソッド
C 11 では、Unicode 文字列型間の変換にいくつかの改良されたメソッドが導入されました。
1. std::wstring_convert
このテンプレート クラスは、変換を実行する便利な方法を提供します。作成したら、次の文字列間の簡単な変換に使用できます:
<code class="cpp">std::wstring_convert<..., char16_t> convert; std::string utf8_string = u8"This string has UTF-8 content"; std::u16string utf16_string = convert.from_bytes(utf8_string);</code>
2.新しい std::codecvt の特殊化
std::codecvt の新しい特殊化は、特定の Unicode 変換にも使用できます:
3 の間で変換します。サブクラスの定義
std::codecvt 特殊化で保護されたデストラクターの問題を回避するには、カスタム サブクラスを定義できます。
<code class="cpp">template <class internT, class externT, class stateT> struct codecvt : std::codecvt<internT, externT, stateT> { ~codecvt() {} }; std::wstring_convert<codecvt<char16_t, char, std::mbstate_t>, char16_t> convert16;</code>
4. std::use_facet テンプレート関数
この関数は、既存の codecvt インスタンスを取得するために使用できます。これは、特殊化の制限により Visual Studio 2010 で役立ちます。
<code class="cpp">std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> convert16;</code>
注: UTF-32 と UTF-16 を直接変換するには、std::wstring_convert の 2 つのインスタンスを組み合わせる必要があります。
Unicode に対する wchar_t の批判
wchar_t Unicode コードポイントを表すために存在しますが、その目的と有用性には次のような制限があります。
移植可能なコードの場合、推奨されるアプローチは、C 11 文字列変換または適切なエンコーディング固有のライブラリを使用することです。
以上がmbstowcs() と wcstombs() が Unicode 文字列変換に最適な選択肢ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。