【问题标题】:Decode bytes to chars one at a time一次将字节解码为字符
【发布时间】:2013-06-18 02:49:56
【问题描述】:

我有一个表示字符的任意字节块,以任意方案编码(可能是 ASCII、UTF-8、UTF-16)。我知道编码。

我要做的是在字节数组中找到最后一个新行 (\n) 的位置。我想知道读完最后一个编码后还剩下多少字节\n。

我在 JDK 或任何其他库中找不到任何可以让我将字节数组一一转换为字符的东西。 InputStreamReader 以块的形式读取流,没有告诉我要读取多少字节来生成字符。

我是否将不得不做一些可怕的事情来重新编码每个字符来计算它的字节长度?

【问题讨论】:

  • 我看到了那个,但它似乎没有回答我的问题(他们只是每个字符使用 2 个字节)
  • 你可以使用循环和映射,然后以支持的编码格式映射所有可能的字符

标签: java utf-8 character-encoding utf-16


【解决方案1】:

你可以试试这样的

    CharsetDecoder cd = Charset.forName("UTF-8").newDecoder();
    ByteBuffer in = ByteBuffer.wrap(bytes);
    CharBuffer out = CharBuffer.allocate(1);
    int p = 0;
    while (in.hasRemaining()) {
        cd.decode(in, out, true);
        char c = out.array()[0];
        int nBytes = in.position() - p;
        p = in.position();
        out.position(0);
    }

【讨论】:

  • 这很好用,谢谢!将 CharBuffer 的限制设置为 1 也可以实现“一次字符”并让您保留转换后的字符。
  • 在 Java 8 中修复了一个与此相关的重大错误。如果在上述情况下存在解码错误,Java7 会从解码调用返回 OVERFLOW,即使存在解码错误并且解码器设置为 REPLACE 错误也是如此。 Java8 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多