您好我有几个typedef:
typedef unsigned char Byte;
typedef std::vector<Byte> ByteVector;
typedef std::wstring String;
我需要将String
转换为ByteVector
,我试过这个:
String str = L"123";
ByteVector vect(str.begin(), str.end());
结果vectror
包含3个元素:1,2,3。但它是wstring
所以这个字符串中的每个字符都很宽,所以我的预期结果是:0,1,0, 2,0,3。
有没有任何标准的方法可以做到这一点,或者我需要编写一些自定义函数。
答案 0 :(得分:4)
Byte const* p = reinterpret_cast<Byte const*>(&str[0]);
std::size_t size = str.size() * sizeof(str.front());
ByteVector vect(p, p+size);
答案 1 :(得分: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_t
中的最后source
为wchar_t()
。转换使用C的全局语言环境,并假定转换在那里设置的任何字符编码。还有一个版本wcstombs_l()
,您可以在其中指定区域设置。
C ++具有类似的功能,但在std::codecvt<...>
方面使用起来有点困难。如有必要,我可以提供一个例子。