【问题标题】:C++ and Java encodingsC++ 和 Java 编码
【发布时间】:2014-02-27 11:50:33
【问题描述】:

我正在尝试使 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 个应用程序?

【问题讨论】:

  • 对 Java 部分无能为力,但在 VC++ 中,尝试转到 Project->Properties->Configuration Properties->General->Character Set 并将值设为“Use Multi-Byte Character Set "

标签: java c++ unicode encoding utf-8


【解决方案1】:

UTF-8 每个字符的长度是可变的。普通字符通过每个字符使用更少的字节来占用更少的空间。更多不常见的字符占用更多空间,因为它们必须以更多字节编码。由于大部分是在美国发明的,猜猜哪些字符较短,哪些字符较长?

如果你想让 Sockets 工作,那么你必须让双方就编码达成一致。否则,你是在打一场失败的战斗。

【讨论】:

  • 那会更容易吗?在 Java 中使用 CP1252 还是在 C++ 中使用 UTF-8?
  • 首先,我认为 VC++ 应用程序在内存中使用什么编码并不重要,重要的是它通过 Socket 发送的内容。所以,问题是:将 Java 应用程序更改为发送 CP1252 更容易,还是将 VC++ 应用程序更改为发送 UTF-8 更容易。我更喜欢后者,因为我是 *nix 头,讨厌 Windows 的一切。但是,我认为这是完全基于我的仇恨的完整意见。
【解决方案2】:

java 做 utf-8 编码是不对的。你可以用 utf8 编写你的源代码,并用一些奇怪的属性符号来编译它(有时真的很烦人)。

字符串在java中的内部表示是utf-16(见What is the Java's internal represention for String? Modified UTF-8? UTF-16?)

【讨论】:

  • 我说的是 someString.getBytes(Charset.defaultCharset());
  • @black 您在 Java 中的默认字符集可能是 UTF-8,但这取决于您的环境。 Java 可能在另一台机器上默认使用不同的东西。无论默认编码如何,您都可以使用 UTF-8 编码来避免这种不确定性。
【解决方案3】:

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

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

byte[] b = s.getBytes("UTF-8");

然后:

outputStream.write(b);

将在套接字上发送数据。

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多