【问题标题】:UTF-16BE and UTF-16 issue in javajava中的UTF-16BE和UTF-16问题
【发布时间】:2015-04-15 11:15:42
【问题描述】:

我有一个文件,当用 geanny * 显示时显示 UTF-16BE。如果我尝试将 Java 中的这个文件转换为不同的编码(比如说 ISO-8859-1),假设它是 UTF-16BE , 每次新建文件的开头都会出现一个问号 (?)。相反,如果我假设它在 UTF-16 中(这是不正确的),则转换后的文件会转换正常,开头没有任何问号。 谁能澄清为什么会出现这种行为?

Bellow 是我使用的代码中的一个 sn-p:


    StringBuilder sb = new StringBuilder();
    BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream, utf16beCharset));
    String line = null;

    while ( (line = buff.readLine()) != null) {

        sb.append(line);
        sb.append('\n');
    }

    String output = new String(sb.toString().getBytes(neededCharset), neededCharset);
    System.out.println(output);

* geanny 是一个文本编辑器

【问题讨论】:

  • 必须是 BOM,这在 BE 模式下是不应该的(你已经知道它是 BE,对吧?)。
  • @Bram 如果这在 BE 中不是预期的,为什么会出现?
  • @artaxerxe BOM 不是 UTF-16BE 编码的一部分,所以它会显示一个问号。
  • @WonderWorld:如果 BOM 本身被转换为非 UTF 字符集而不是在转换之前被剥离,则会出现 ?

标签: java character-encoding utf-16


【解决方案1】:

您的问题是 BOM (Byte Order Mark)。

如果您将字符集定义为UTF-16,那么 Java 会识别 BOM 并在读取后将其删除。然后 BOM 告诉 Java 字符流是 (UTF-16)BE。

如果您定义UTF-16BE,那么您告诉 Java 忽略 BOM,Java 会忽略它并将其写入您的目标文件。

【讨论】:

  • 如何检测和忽略此类字符?
  • @DivyangShah BOM 为 0xFEFF(如链接文章中所述)。因此,要么让 Java 进行检测和删除,要么远程 UTF-16 流中的前 2 个字节。
猜你喜欢
  • 2012-10-08
  • 2014-08-21
  • 2011-01-11
  • 2021-11-20
  • 2023-03-24
  • 2011-01-07
  • 1970-01-01
  • 2013-02-25
  • 2019-02-02
相关资源
最近更新 更多