【问题标题】:Read string from binary file, different encodings从二进制文件中读取字符串,不同的编码
【发布时间】:2012-09-02 18:59:37
【问题描述】:

我正在尝试读取由 C# 程序创建的 Java (android) 二进制文件,但是我偶然发现了一个问题。 C# 默认使用 UTF-7 编码二进制文件中的字符串,Java 使用 UTF-8。这当然意味着字符串没有正确加载。

我想知道如何将字符串读取为 UTF-7 而不是 UTF-8。我还注意到我在浮动方面遇到了类似的问题。 C# 和 Java 处理它们的方式是否不同,如果是,我如何在 Java 中正确阅读。

编辑:我在 C# 程序中使用 BinaryWriter 类,在 java 中使用 DataInputStream 类。

【问题讨论】:

  • 呃,你在问什么?与我们分享一些代码或其他内容以使您的问题更具体一点?

标签: c# java android character-encoding io


【解决方案1】:

除非另有说明,否则 C# 使用 UTF-8 编码。

编辑此处的文档不正确。
查看源代码,BinaryWriter 使用以下代码将字符串长度写为 7 位编码整数

    protected void Write7BitEncodedInt(int value) {
        // Write out an int 7 bits at a time.  The high bit of the byte, 
        // when on, tells reader to continue reading more bytes. 
        uint v = (uint) value;   // support negative numbers
        while (v >= 0x80) { 
            Write((byte) (v | 0x80));
            v >>= 7;
        }
        Write((byte)v); 
    }

您需要将此代码移植到 Java 以了解要读取的字节数。

【讨论】:

  • @Frozendragon:错了。它将 long 写入使用 UTF7 编码的整数,然后使用 writer 的编码写入字符串。 (默认为 UTF8)
  • 这不会影响 Java 将其读取为 UTF-8 编码字符串的能力吗?
  • @SLaks 见Description section of Wikipedia's article on UTF-7 的最后一段。 “...然而,...而不是 UTF-7,而是使用与 LEB128 相同的小端可变长度数量;实际上计数是字节计数而不是字符计数。”跨度>
猜你喜欢
  • 2014-06-18
  • 2012-09-05
  • 2010-10-08
  • 2018-05-06
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多