3

こんにちは、いくつかの typedef があります。

typedef unsigned char Byte;
typedef std::vector<Byte> ByteVector;
typedef std::wstring String;

に変換する必要がありますStringByteVectorこれを試しました:

String str = L"123";
ByteVector vect(str.begin(), str.end());

結果として、vectror1、2、3 の 3 つの要素が含まれます。ただしwstring、この文字列のすべての文字が広いため、予想される結果は 0、1、0、2、0、3 になります。

それを行う標準的な方法はありますか、それともカスタム関数を書く必要がありますか。

4

2 に答える 2

4
Byte const* p = reinterpret_cast<Byte const*>(&str[0]);
std::size_t size = str.size() * sizeof(str.front());
ByteVector vect(p, p+size);
于 2013-08-20T12:39:31.350 に答える
2

あなたの本当の目標は何ですか?オブジェクトを表すバイトを取得したいだけの場合は、へのキャストだけではなく、明示的な変換wchar_tを使用しますが、かなり単純な変換でうまくいきます。unsigned char const*

一方、実際にstd::wstring文字を扱う場合のように、UTF8 や UTF16 などを使用してエンコードされたシーケンスに実際に変換する場合、エンコードに使用される変換は非常に複雑になります。おそらく、エンコーディングに変換する最も簡単な方法は、C を使用することwcstombs()です。

std::vector<char> target(source.size() * 4);
size_t n = wcstombs(&target[0], &source[0], target.size());

上記のフラグメントは、sourceが空ではなく、最後のwchar_tinsourceがであると想定していますwchar_t()。変換は C のグローバル ロケールを使用し、そこに設定されている文字エンコーディングを変換することを前提としています。wcstombs_l()ロケールを指定できるバージョンもあります。

std::codecvt<...>C++ にも同様の機能がありますが、ファセットで使用するのは少し難しくなります。必要に応じて例を提供できます。

于 2013-08-20T12:54:10.797 に答える