我正在尝试使用套接字进行Java应用程序和VS C ++应用程序的通信并向对方发送不同的消息。到目前为止我遇到的唯一问题 - 我的编码绝对丢失了。
默认情况下,Java使用UTF-8。就我而言,这是一个Unicode字符集。在我的VS项目中,我将设置设置为Unicode。虽然出于某种原因,当我调试我的代码时,我总是看到我的字符串在内存中编码为CP1252。
此外,如果我尝试在Java中使用CP1252,它适用于英文字母,但每当我尝试一些俄语字母时,我会得到一个3f
字节的每个字母。
另一方面,我尝试在Java中使用UTF-8 - 每个英文字母长1个字节,但每个俄文字母长2个字节。它不是多字节编码吗?
有些关于C ++的文档说std::string(char)
使用UTF-8代码页,而std:wstring(wchar_t)
使用UTF-16。当我调试我的应用程序时,我看到它们都有CP1252编码,尽管wstring在每个字母之间都有空字节。
请问您能解释编码在Java和C ++中的行为,以及我应该如何传达我的2个应用程序?
答案 0 :(得分:2)
UTF-8每个字符的长度可变。通过每个字符使用更少的字节,常见字符占用更少的空间。更多不常见的字符占用更多空间,因为它们必须以更多字节编码。由于大多数这是在美国发明的,猜猜哪些字符更短,哪些字符更长?
如果您希望套接字工作,那么您必须让双方同意编码。否则,你正在打一场失败的战斗。
答案 1 :(得分:0)
java执行utf-8编码并不正确。您可以在utf8中编写源代码,并使用属性中的一些奇怪的符号进行编译(有时真的很烦人)。
字符串java中的内部表示形式为utf-16(参见What is the Java's internal represention for String? Modified UTF-8? UTF-16?)
答案 2 :(得分:0)
Unicode是一个字符集,UTF-8和UTF-16是Unicode的编码。对于英语(实际上是ASCII)字符,UTF-8产生与CP1252相同的值,UTF-16增加一个零字节。如果您想使用俄语(西里尔语),您可以使用UTF-8,UTF-16或CP1251。但两个应用程序必须就编码达成一致。
例如,如果您同意使用UTF-8,则以下内容将使用UTF-8将Java String转换为字节数组:
byte [] b = s.getBytes(“UTF-8”);
然后:
outputStream.write(B);
将在套接字上发送数据。