我需要在(非托管)C++ 中实现这个 Java 代码:
byte[] b = string.getBytes("UTF8");
我是 C++ 新手,找不到任何东西可以做到这一点。如果可能,它必须独立于平台。使用 c++11 编译器。
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
的将宽字符 UTF-16 字符串转换为 UTF-8 多字节字符串 via to_bytes
(它也支持另一个方向的转换)。
这是通过(也是新引入的)std::codecvt_utf8_utf16
转换方面实现的。它很好地为我们处理了实际的转换。
除此之外,它还利用了 C++11 中添加的新字符文字前缀——特别是 ,u
用于char16_t
UTF-16 字符串 :-) 还有u8
和分别U
用于 UTF-8 和 UTF-32。
PS data
(从 C++11 开始)保证等于c_str
,因此可以依赖它是 NUL 终止的。
解决方案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;
假设字符串已经是 UTF-8,您可以使用:
char const *c = myString.c_str();
对于读/写访问,您可以使用:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
C++ 中的字符串通常是 ASCII 每个字符 1 个字节。因此,如果您使用典型的 std::string,则必须在将其编组为 C++ 之前对其进行处理。然而,不幸的是,C++ 确实定义了一个宽字符串 std::wstring(来自关于宽字符的维基百科文章):
wchar_t 的宽度是特定于编译器的,可以小到 8 位。因此,需要在任何 C 或 C++ 编译器之间移植的程序不应使用 wchar_t 来存储 Unicode 文本。wchar_t 类型用于存储编译器定义的宽字符,在某些编译器中可能是 Unicode 字符。
所以我们必须知道你将使用什么 C++ 编译器来完全回答这个问题。对于 std::wstring 类,没有 to bytes 类型函数,因此您要做的是使用其他答案中提到的 c_str() 然后使用 &(bit wise and) 和字节掩码来拆分宽字符为字节。
在 Visual C++ 中,宽字符是 16 位,因此您需要类似以下内容将每个字符处理为字节:
high_byte = wcharacter & 0xFF00;
low_byte = wcharacter & 0xFF;