【问题标题】:Java string results different to C#Java 字符串结果与 C# 不同
【发布时间】:2020-09-24 01:31:16
【问题描述】:

我正在读取套接字流并将字节数组转换为 Java 和 C# 中的单个字符串,但结果不同...

C#代码:

string text = Encoding.Default.GetString(ms.ToArray());

Java 代码:

String text = new String(data);

我在研究中遇到的一个潜在问题是 C# 的默认编码是 UTF-32 而 Java 的默认编码是 UTF8,而 C# 使用 little endian 而 Java 使用 Big endian,所以解决方案是在java as UTF-32LE,但即便如此,它返回的结果与 C# 完全不同,而且大多数(如果不是全部)字符串都是 的组合

正如关于我在 Java 中的方法的额外信息,我使用 ByteArrayOutputStream 存储来自 DataInputStream 的数据,而在 C# 中,我使用 MemoryStream 存储来自 NetworkStream 的数据

【问题讨论】:

  • Java 的默认编码是您的平台默认支持的任何编码。它适用于希望以“简单”方式与本地平台兼容的学生。如果你想要 UTF-8,你必须指定它:docs.oracle.com/javase/8/docs/api/java/lang/…
  • 您确定Encoding.Default 是UTF-32 吗?这似乎是一个奇怪的默认设置,因为没有 Windows 系统正常使用它。也许您应该打印出Encoding.Default,和/或在Java 端检查data 中的实际字节?

标签: java c# datainputstream bytearrayoutputstream


【解决方案1】:

由于流中的字节使用某种编码进行编码,因此您必须在 C# 和 Java 代码中明确设置正确的编码。

它们使用不同的默认编码。

为了使字节流具有互操作性,您必须坚持使用一种用于将字符串编码为字节的编码。或者在流中的某处交换编码类型。

【讨论】:

  • 我正在尝试将 Java 配置为输出与 C# 相同的结果,有人说 UTF-32 是 C# 的默认值并且它使用 Little Endian,所以我尝试了 new String(bytes, "UTF-32LE") 但它仍然输出完全不同结果到 C#
  • 有何不同?只是小端和大端不同还是没有可比性?
  • @Michael 如果我在 Java 中使用 UTF8,它在某种程度上类似于,但整个字符串不匹配并且如果我使用建议的 UTF-32LE,则使用 的序列会留下一些无法读取的响应这是不可比较的,整个字符串是 和其他一些变体,例如 䀀Ā 但没有可读性。
  • 尝试查看字节数组并进行比较。不确定这是不是问题,但你知道大端和小端有什么区别吗?
  • @Michael 我不熟悉 Big endian 和 Little endian,但这不是字节存储的方式吗?大端/小端几乎是相互颠倒的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多