如何使用字节作为媒介将Java字符串转换为c++字符串
How to convert Java String to C++ String using bytes as the medium
下面流程图中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::string
和std::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
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何将字符串数组返回到 java JNI
- 如何在 c++ 中读取用 utf-8 编码的 java unicode 字节字符串
- 如何从 C/C++ 在 JNI for Java 中创建 UTF16 字符串?
- Java 调用 dll 字符串返回类型方法
- C++和Java的字符串循环性能比较
- 任何C 字符串库,例如QString(或Java String)
- 如何将字符串数组从C++返回到Java(JNI)
- JNI - 如何填充从 C++ 传递到 Java 的字符串
- JNI将字符串从Java传递到C ,然后将C 字符串传递给字符串数组
- 将 C++ 中的字符值转换为具有与 Java 中相同值的字符串
- 从本机代码返回"const char*"并在java中获取"字符串"
- JNI 代码返回字符串,但得到错误 java.lang.UnsatisfiedLinkError: com.packag
- 从 c++ 库中获取一个字符串,周围有一个 java 包装器
- 触发Java Jar用C 运行并传递字符串
- 如何使用 2 个字符串参数从 jni java 库调用
- 字符串在从Android Java调用ndk c ++函数后会得到一个奇怪的形式
- Python,C ,C#和Java中的字符串比较之间的差异
- 通过字符串将wav数据从Java发送到Cpp
- jvm在尝试将TCHAR类型发送到接受字符串作为参数的java函数时崩溃