1

我需要在(非托管)C++ 中实现这个 Java 代码:

byte[] b = string.getBytes("UTF8");

我是 C++ 新手,找不到任何东西可以做到这一点。如果可能,它必须独立于平台。使用 c++11 编译器。

4

4 回答 4

3

Java大致String相当于. 我建议你尝试类似...std::u16stringstd::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_tUTF-16 字符串 :-) 还有u8和分别U用于 UTF-8 和 UTF-32。


PS data(从 C++11 开始)保证等于c_str,因此可以依赖它是 NUL 终止的。

于 2012-09-01T19:53:47.133 回答
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;
于 2012-09-01T20:12:11.400 回答
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];
于 2012-09-01T18:55:35.867 回答
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;
于 2012-09-01T19:13:35.283 回答