0

C++ 標準テンプレート ライブラリ (STL) は、UTF8 でエンコードされたバイト バッファーを wstring に変換する方法を提供していますか?

例えば:

const unsigned char* szBuf = (const unsigned char*) "d\xC3\xA9j\xC3\xA0 vu";
std::wstring str = method(szBuf); // Should assign "déjà vu" to str

次のように、独自の UTF8 変換コードを実装する必要はありません。

const unsigned char* pch = szBuf;    
while (*pch != 0)
{
    if ((*pch & 0x80) == 0)
    {
    str += *pch++;
    }
    else if ((*pch & 0xE0) == 0xC0 && (pch[1] & 0xC0) == 0x80)
    {
        wchar_t ch = (((*pch & 0x1F) >> 2) << 8) +
            ((*pch & 0x03) << 6) +
            (pch[1] & 0x3F);
        str += ch;
        pch += 2;
    }
    else if (...)
    {
        // other cases omitted
    }
}

編集:コメントと回答をありがとう。このコード フラグメントは、目的の変換を実行します。

std::wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> convert;
str = convert.from_bytes((const char*)szBuf);
4

1 に答える 1

1

C++11 では、 を使用できますstd::codecvt_utf8。それがなければ、自分のやりたいように説得できるかもしれません。残念ながら、それもユビキタスではなく、UTF-8 をサポートするiconvすべての実装ではありません。iconv_openwchar_t

どちらも持っていない場合は、ICUなどのサードパーティ ライブラリを使用することをお勧めします。驚いたことに、Boost には目的がないように見えますが、見落とすこともありました。

于 2013-07-21T16:47:52.940 に答える