如何使用字节作为媒介将Java字符串转换为c++字符串

How to convert Java String to C++ String using bytes as the medium

本文关键字:字符串 Java 转换 c++ 何使用 字节      更新时间:2023-10-16

下面流程图中c++代码C++functionX的算法/实现是什么?

(JavaString) --getBytes--> (bytes) --C++functionX--> (C++String)

JavaString含量应尽可能与C++String含量匹配(JavaString的所有可能值最好为100%)

[EDIT]字节的端序可以被忽略,因为有很多方法可以处理它。

Java:

String original = new String("BANANAS");
byte[] utf8Bytes = original.getBytes("UTF8");
//save the length as a 32 bit integer, then utf8 Bytes to a file
c++:

int32_t tlength;
std::string utf8Bytes;
//load the tlength as a 32 bit integer, then the utf8 bytes from the file
//well, that's easy for UTF8
//to turn that into a utf-18 string in windows
int wlength = MultiByteToWideChar(CP_UTF8, 0, utf8Bytes.c_str(), utf8Bytes.size(), nullptr, 0);
std::wstring result(wlength, '');
MultiByteToWideChar(CP_UTF8, 0, utf8Bytes.c_str(), utf8Bytes.size(), &result[0], wlength);
//so that's not hard either

要在linux中做到这一点,可以使用iconv库,它非常强大,但使用起来比较困难。下面是将UTF8中的std::string转换为UTF32中的std::wstring的函数:http://coliru.stacked-crooked.com/view?id=986a4a07e391213559d4e65acaf231d5-e54ee7a04e4b807da0930236d4cc94dc

没有一个真正的c++ String类。仅STL就有std::stringstd::wstring。也就是说,大多数字符串类都有一个以原始字节指针作为参数的构造函数。字节以const char *的形式出现。因此,C++functionX的一个很好的例子是构造函数std::string::string(const char*, int)

注意编码问题。getBytes()接受编码作为参数;你最好在c++端匹配它,否则会出现混乱。如果不确定,请使用UTF-8。

取决于你有什么类型的Java字符串,你可能想要选择常规字符串或宽字符串(例如std::wstring)。后者是Java String提供的稍微更好的表示。

c++,就标准而言,不知道编码。Java。因此,为了连接两者,让Java发出一些定义良好的编码,如UTF8:

byte[] utf8str = str.getBytes("UTF8");

在c++中,使用iconv()等库将utf8字符串转换为另一个定义良好的编码字符串(例如std::u32string与UTF-32,如果你有c++ 11,或std::basic_string<uint32_t>std::vector<uint32_t>否则),或者,或者,将其转换为WCHAR_T编码,存储在std::wstring中,并继续通过标准函数wcstombs()将其转换为多字节字符串,如果你希望与环境接口。

选择取决于您需要对字符串做什么。对于序列化或文本处理,使用确定的编码(例如UTF-32)。要使用系统的区域设置写入标准输出,请使用多字节转换。

c++字符串可能应该是std::wstring实例,并且您还需要跟踪用于从JavaString转换为字节的编码。

这篇文章可能会对你有更多的帮助:

std::wstring VS std::string