C++;和Java编码 我尝试使用java套接字和VC++应用程序进行通信,并使用套接字发送不同的消息。到目前为止,我唯一的问题是——我完全迷失在他们的编码中

C++;和Java编码 我尝试使用java套接字和VC++应用程序进行通信,并使用套接字发送不同的消息。到目前为止,我唯一的问题是——我完全迷失在他们的编码中,java,c++,unicode,encoding,utf-8,Java,C++,Unicode,Encoding,Utf 8,默认情况下,Java使用UTF-8。就我而言,这是一个Unicode字符集。在我的VS项目中,我将设置设置为Unicode。尽管出于某种原因,当我调试代码时,我总是在内存中看到编码为CP1252的字符串。 此外,如果我尝试在Java中使用CP1252,它对英文字母很有效,但每当我尝试一些俄语字母时,每个字母都会得到一个3f字节。 另一方面,如果我尝试在Java中使用UTF-8,则每个英文字母的长度为1字节,但每个俄文字母的长度为2字节。这不是一种多字节编码吗 C++的一些文档说明 STD::S

默认情况下,Java使用UTF-8。就我而言,这是一个Unicode字符集。在我的VS项目中,我将设置设置为Unicode。尽管出于某种原因,当我调试代码时,我总是在内存中看到编码为CP1252的字符串。 此外,如果我尝试在Java中使用CP1252,它对英文字母很有效,但每当我尝试一些俄语字母时,每个字母都会得到一个
3f
字节。 另一方面,如果我尝试在Java中使用UTF-8,则每个英文字母的长度为1字节,但每个俄文字母的长度为2字节。这不是一种多字节编码吗

C++的一些文档说明<代码> STD::String(char)< /C>使用UTF-8代码页,和<代码> STD:WString(WCHARGYT) -UTF-16。当我调试我的应用程序时,我看到它们都使用CP1252编码,尽管wstring在每个字母之间都有空字节

<> P>你能解释java和C++中的编码行为吗?我应该如何交流我的2个应用程序?

每个字符的长度可变。普通字符占用的空间更少,每个字符占用的字节更少。更多的非通用字符占用更多空间,因为它们必须以更多字节进行编码。由于这些文字大部分是在美国发明的,猜猜看,哪些文字较短,哪些较长


如果你想让套接字工作,那么你必须让双方在编码上达成一致。否则,您将面临一场失败的战斗。

java不支持utf-8编码。您可以用utf8编写源代码,并在属性中使用一些奇怪的符号进行编译(有时真的很烦人)


字符串在java中的内部表示是utf-16(请参见)

Unicode是字符集,utf-8和utf-16是Unicode编码。对于英语(实际上是ASCII)字符,UTF-8产生与CP1252相同的值,UTF-16添加一个零字节。如果您想使用俄语(西里尔文),可以使用UTF-8、UTF-16或CP1251。但两个应用程序必须在编码上达成一致

例如,如果您同意UTF-8,则以下内容将使用UTF-8将Java字符串s转换为字节数组:

字节[]b=s.getBytes(“UTF-8”)

然后:

outputStream.write(b)


将在套接字上发送数据。

那么什么更容易?在C++中使用CP1252还是java中的UTF-8?首先,我认为VC++应用程序在内存中使用什么编码并不重要,它是通过套接字发送的。所以,问题是:将Java应用程序更改为发送CP1252更容易,还是将VC++应用程序更改为发送UTF-8更容易。我更喜欢后者,因为我是个傻瓜,讨厌所有的东西。但是,我认为这完全是基于我的仇恨的观点@黑色Java中的默认字符集可能是UTF-8,但这取决于您的环境。Java可能默认在另一台机器上使用不同的东西。您可以通过使用UTF-8编码来避免这种不确定性,而不管默认编码是什么。这对Java部分没有帮助,但在VC++中,尝试转到Project->Properties->Configuration Properties->General->Character Set并将值设置为“Use Multi-Byte Character Set”