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());

结果vectror包含 3 个元素:1、2、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对象的字节,那么一个相当简单的转换就可以解决问题,尽管我不会只使用转换为 tounsigned 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_t是. 转换使用 C 的全局语言环境,并假定转换那里设置的任何字符编码。还有一个版本,您可以在其中指定语言环境。sourcewchar_t()wcstombs_l()

C++ 具有类似的功能,但在方面使用起来有点困难std::codecvt<...>。如有必要,我可以提供一个例子。

于 2013-08-20T12:54:10.797 回答