Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Java字符串转换为C++;使用字节作为媒介的字符串 < C++代码>代码> C++函数X >代码>在以下流程图中的算法/实现: (JavaString) --getBytes--> (bytes) --C++functionX--> (C++String)_Java_C++_String - Fatal编程技术网

如何将Java字符串转换为C++;使用字节作为媒介的字符串 < C++代码>代码> C++函数X >代码>在以下流程图中的算法/实现: (JavaString) --getBytes--> (bytes) --C++functionX--> (C++String)

如何将Java字符串转换为C++;使用字节作为媒介的字符串 < C++代码>代码> C++函数X >代码>在以下流程图中的算法/实现: (JavaString) --getBytes--> (bytes) --C++functionX--> (C++String),java,c++,string,Java,C++,String,JavaString内容应尽可能匹配C++String内容(对于JavaString的所有可能值,最好100%) [编辑]字节的尾数可以忽略,因为有办法处理>没有一个真正的C++字符串类。STL本身就有std::string和std::wstring。也就是说,大多数字符串类都有一个构造函数,它将原始字节指针作为参数。字节以const char*的形式出现。因此,构造函数std::string::string(const char*,int)就是一个很好的例子 请注意编码问题。getBytes(

JavaString
内容应尽可能匹配
C++String
内容(对于
JavaString
的所有可能值,最好100%)


[编辑]字节的尾数可以忽略,因为有办法处理

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

请注意编码问题。getBytes()将编码作为参数;你最好在C++的边上匹配,否则你会得到混乱。如果不确定,请使用UTF-8


根据您拥有的Java字符串类型,您可能希望选择常规字符串或宽字符串(例如,
std::wstring
)。后者是java字符串提供的一个稍微好一些的表示。

< P> C++字符串应该是STD::WString实例,并且您需要跟踪JavaString从字节到字节的转换。p> 这篇文章可能会为您提供更多帮助:

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++:


要在linux中实现这一点,可以使用iconv库,它功能强大,但使用起来更加困难。这里有一个函数,它将UTF8中的
std::string
转换为UTF32中的
std::wstring

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

byte[] utf8str = str.getBytes("UTF8");
<>在C++中,使用一个库如<代码> ICON()/CUT>将UTF8字符串转换成另一个定义良好的编码字符串(例如,代码为:>代码:STD:U32 String < /CUT>用UTF-32,如果你有C++ 11,或者<代码> STD::Basic字符串或<代码> STD::向量< /代码>,否则,或者,将它转换成<代码> WHARGYTT < /COD>编码,存储在
std::wstring
中,如果希望与您的环境交互,则可通过标准函数
wcstombs()
进一步将其转换为多字节字符串


选择取决于您需要对字符串执行的操作。对于序列化或文本处理,使用确定编码(例如UTF-32)。要使用系统的区域设置写入标准输出,请使用多字节转换。(这里是C++中的一个编码)

java字符串是如何进入C++的?通过文件?你的意思是从一种编程语言到另一种编程语言?@Mooing Duck:java字节是用base64编码的,并使用XMPP通过线路传输。根据,
字符串表示UTF-16格式的字符串,有时类似于
std::wstring
std::wstring
在Windows上是16字节,但在Linux上不是。根据OP希望对其字符串执行的操作以及内容的性质,UTF-8中的单字节字符串也可以执行此操作。您会惊讶于有多少文本处理任务是相当的ASCII友好的。我不知道STL,但是C++标准库有4个字符串类(所有代码都是<代码> STD::Basic字符串S/<代码>):<代码> STD::String ,代码> STD::WString ,<代码> STD::U16String >和<代码> STD::U32 String 。在这种情况下,我认为
std::u16string
非常适合:)@Mooing:16字节?这是一个宽泛的角色。取决于他在做什么,他可能会遇到endian的问题,但这可能是最合适的。我不得不承认这一点
mbtowc
(我想你的意思是
mbstowcs
)没有显式编码的概念。它的目的不是从UTF8转换。您确实希望使用一个处理显式编码的库,例如
iconv()
。ANSI-C中的
mb/wc
函数的唯一用途是以平台相关的方式在
char
wchar\u t
之间进行转换。@Kerrek:我最初有MultiByteToWideChar,但后来在寻找跨平台的内容时发现
mbstowcs
并没有实现您所声称的功能。它的目的是不同的。它在实践中可能会起作用,但不是因为它保证会起作用。@Kerrek:我看错了文件。我切换到依赖操作系统的代码,但我以前从未使用过linux,所以这只是一个猜测。@Mooing:好的-我不会把
iconv()
称为非常依赖操作系统的代码-它是广泛可用的,至少是Posix和Windows。关键是,人们必须承认C++在标准中没有任何内置的编码处理,因此任何此类问题都需要一个编码处理库。code>iconv
是一个很好的选择。
byte[] utf8str = str.getBytes("UTF8");