Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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
在从JavaSOAP接收的Windows调用(C++)中使用Unicode文本 我使用C++的GSOAP来发送和接收java的Web服务调用。Java认为字符与C/C++认为字符的区别似乎造成了巨大的破坏,不同的代码页也是如此。这个问题有两个不同的部分 我读到Java在内存中以UTF-16的形式存储字符串,在磁盘上以UTF-8的形式存储字符串。当我有一个java字符串被发送到C++客户端时,我应该假定它是UTF-8还是UTF-16? 当我从java接收字符串并将其插入到STD::WString中时,C++没有使用任何类型的转换,而客户端使用WINDOWS 1252代码页。接收和转换unicode字符串MultiByteToWideChar的函数是否正确? 虽然我调用SetComputerNameExW的Windows函数是要接受Unicode的,但是当我通过SOAP从java接收的字符串中通过时,我专门将字符串重新编码为UTF-8,同时调试请求并将其解码为C++侧的UTF-8,将值传递给SetComputerNameExW后,系统将启动重新启动,但仅将计算机重命名为第一个字符,即,如果我的字符串是ThisIsATëst,则计算机将重命名为T。这些Windows API调用是否必须使用特定的Unicode格式?_Java_C++_Windows_Soap_Unicode - Fatal编程技术网

在从JavaSOAP接收的Windows调用(C++)中使用Unicode文本 我使用C++的GSOAP来发送和接收java的Web服务调用。Java认为字符与C/C++认为字符的区别似乎造成了巨大的破坏,不同的代码页也是如此。这个问题有两个不同的部分 我读到Java在内存中以UTF-16的形式存储字符串,在磁盘上以UTF-8的形式存储字符串。当我有一个java字符串被发送到C++客户端时,我应该假定它是UTF-8还是UTF-16? 当我从java接收字符串并将其插入到STD::WString中时,C++没有使用任何类型的转换,而客户端使用WINDOWS 1252代码页。接收和转换unicode字符串MultiByteToWideChar的函数是否正确? 虽然我调用SetComputerNameExW的Windows函数是要接受Unicode的,但是当我通过SOAP从java接收的字符串中通过时,我专门将字符串重新编码为UTF-8,同时调试请求并将其解码为C++侧的UTF-8,将值传递给SetComputerNameExW后,系统将启动重新启动,但仅将计算机重命名为第一个字符,即,如果我的字符串是ThisIsATëst,则计算机将重命名为T。这些Windows API调用是否必须使用特定的Unicode格式?

在从JavaSOAP接收的Windows调用(C++)中使用Unicode文本 我使用C++的GSOAP来发送和接收java的Web服务调用。Java认为字符与C/C++认为字符的区别似乎造成了巨大的破坏,不同的代码页也是如此。这个问题有两个不同的部分 我读到Java在内存中以UTF-16的形式存储字符串,在磁盘上以UTF-8的形式存储字符串。当我有一个java字符串被发送到C++客户端时,我应该假定它是UTF-8还是UTF-16? 当我从java接收字符串并将其插入到STD::WString中时,C++没有使用任何类型的转换,而客户端使用WINDOWS 1252代码页。接收和转换unicode字符串MultiByteToWideChar的函数是否正确? 虽然我调用SetComputerNameExW的Windows函数是要接受Unicode的,但是当我通过SOAP从java接收的字符串中通过时,我专门将字符串重新编码为UTF-8,同时调试请求并将其解码为C++侧的UTF-8,将值传递给SetComputerNameExW后,系统将启动重新启动,但仅将计算机重命名为第一个字符,即,如果我的字符串是ThisIsATëst,则计算机将重命名为T。这些Windows API调用是否必须使用特定的Unicode格式?,java,c++,windows,soap,unicode,Java,C++,Windows,Soap,Unicode,非常感谢您的帮助!谢谢 我已经读到Java在内存中以UTF-16的形式存储字符串 过去是这样,但现在正在改变。根据,内存中存储可能很快会改用ISO-8859-1,但前提是它比UTF-16更紧凑且不会丢失数据。尽管Java字符串使用基于UTF-16的公共接口,无论其内存存储是否使用ISO-8859-1。所以只要假装他们总是UTF-16 当我有一个java字符串被发送到C++客户端时,我应该假定它是UTF-8还是UTF-16?< /P> 你也不能假设。您必须查看实际的SOAP数据。SOAP使用XML

非常感谢您的帮助!谢谢

我已经读到Java在内存中以UTF-16的形式存储字符串

过去是这样,但现在正在改变。根据,内存中存储可能很快会改用ISO-8859-1,但前提是它比UTF-16更紧凑且不会丢失数据。尽管Java字符串使用基于UTF-16的公共接口,无论其内存存储是否使用ISO-8859-1。所以只要假装他们总是UTF-16

当我有一个java字符串被发送到C++客户端时,我应该假定它是UTF-8还是UTF-16?< /P> 你也不能假设。您必须查看实际的SOAP数据。SOAP使用XML,并且XML可以使用创建者想要的任何字符编码,只要它在XML prolog中声明它(如果它不是UTF-8),UTF-8是XML中最常用的编码。不要假设,要知道你在做什么。如果您使用的是SOAP库,那么您将受到它为其内存中字符串选择的任何编码的限制

<>当我从java接收字符串并将其插入到STD::WString中时,C++没有使用任何类型的转换,而客户端使用WINDOWS 1252代码页。 这是不太可能的,因为std::wstring在Windows上使用UTF-16,而且Java字符串在所有意图和用途上也是UTF-16。您必须正确地转换字符串。请显示您的实际代码

接收和转换unicode字符串MultiByteToWideChar的函数是否正确

如果您有一个以char*或std::string开头的8位字符串ANSI,那么是的。但是,当通过JNI/JNA或std::wstring直接与Java交互时,情况就不应该是这样了。因此,我想知道你是否在C++侧使用了一个基于8位ANSI字符串而不是16位Unicode字符串的SOAP实现。

虽然我调用SetComputerNameExW的Windows函数是要接受Unicode,但是当我通过SOAP从java接收的字符串中通过时,我专门将字符串重新编码为UTF-8,同时调试请求并将其解码为C++侧的UTF-8,在将值传递给SETATECTMANEXEXW之后,系统启动重新启动< /P> 您不能将UTF-8字符串传递给SetComputerNameExW,代码甚至不会编译,除非您使用无效的类型转换强制它。您必须传递一个UTF-16字符串

但只将机器重命名为第一个字符,即,如果我的字符串是ThisIsATëst,则机器将重命名为T

这意味着你的转换过程非常糟糕。无论您认为要传递给SetComputerNameExW的内容不是实际传递的内容,它的格式都不正确,这就是SetComputerNameExW只拾取第一个字符的原因

但同样,在这种情况下,您没有显示实际的SOAP数据或代码,因此没有人能告诉您字符串格式不正确的原因

这些Windows API调用是否必须使用特定的Unicode格式

Win32 API仅支持两种类型的字符串:

本地化的ANSI字符串

UTF-16字符串


除了极少数情况外,您根本不能使用UTF-8,因此您必须将任何UTF-8数据转换为其他格式之一(最好是UTF-16),因为UTF之间的转换损耗较小,而且Windows核心还是基于UTF-16。

…在磁盘上是UTF-8,这通常取决于您对正在使用的IO api的编码。Windows使用UTF-16LE。如果Java中有UTF-16字符串,只需将它们传递给Windows即可。如果将它们另存为UTF-8,则在将它们读入Windows程序时,需要将其转换为UTF-16LE
. MultiByteToWideChar可以从UTF-8转换为UTF-16,C++11标准函数也可以。令人惊讶的答案,非常受欢迎,并且非常清晰。荣誉