我需要在(非托管)c ++中实现这个Java代码:
byte[] b = string.getBytes("UTF8");
我是c ++的新手,找不到任何可以做到的事情。如果可能,它必须是独立于平台的。使用c ++ 11编译器。
答案 0 :(得分:3)
Java String
大致相当于std::u16string
,std::basic_string
的特化。我建议你试试像......
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
std::string converted = convert.to_bytes(u"HELLO, WORLD!");
const char *bytes = converted.data();
注意这依赖于C ++ 11;可能在您的编译器供应商完全支持这些功能之前的某个时间。
在这里,我们利用新引入的std::wstring_convert
通过to_bytes
从宽字符UTF-16字符串转换为UTF-8多字节字符串(它也支持在另一个方向转换) )。
这可以通过(也是新引入的)std::codecvt_utf8_utf16
转换方面实现。它很好地照顾了我们的实际转换。
除此之外,它还使用了添加了C ++ 11的新字符文字前缀 - 特别是u
,用于char16_t
UTF-16字符串:-)还有分别为UTF-8和UTF-32 u8
和U
。
PS data
(从C ++ 11开始)保证等于c_str
,因此可以依赖于NUL终止。
答案 1 :(得分:1)
解决方案编号1: -
char bytecpp[]= u8"You don't need strings.getbytes :P";
解决方案编号2: -
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>> myconv;
std::string mbstring = myconv.to_bytes(u"Hello\n");
std::cout << mbstring;
答案 2 :(得分:0)
假设字符串已经是UTF-8,您可以使用:
char const *c = myString.c_str();
对于读/写访问,您可以使用:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
答案 3 :(得分:0)
C ++中的字符串通常是每个字符ASCII 1字节。因此,如果使用典型的std :: string,那么在将它编组为C ++之前,必须先处理它。但是,不幸的是,C ++确实定义了一个宽字符串std :: wstring(来自wikipedia关于宽字符的文章):
wchar_t的宽度是特定于编译器的,可以小到8位。因此,需要可以在任何C或C ++编译器上移植的程序不应使用wchar_t来存储Unicode文本。 wchar_t类型用于存储编译器定义的宽字符,在某些编译器中可能是Unicode字符。
因此,我们必须知道您将使用什么C ++编译器来完全回答这个问题。对于std :: wstring类,没有to bytes类型的函数,所以你要做的是使用其他答案中提到的c_str()然后使用&amp;(bit wise和)和一个字节掩码来分割宽字符in to bytes。
在Visual C ++中,宽字符是16位,因此您需要类似下面的内容来处理每个字符到字节:high_byte = wcharacter & 0xFF00;
low_byte = wcharacter & 0xFF;