当前位置: 首页 > 知识库问答 >
问题:

java中的UTF-16BE和UTF-16问题

太叔马鲁
2023-03-14

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


    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);

共有1个答案

宦瀚
2023-03-14

您的问题是BOM(字节顺序标记)。

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

如果定义utf-16be,则告诉Java忽略BOM,Java忽略它并将其写入目标文件。

 类似资料:
  • 问题内容: UTF-8和UTF-16之间的区别?我们为什么需要这些? 问题答案: 我相信Web上有很多关于此的好文章,但这是一个简短的摘要。 UTF-8和UTF-16都是可变长度编码。但是,在UTF-8中,字符可能至少占据8位,而在UTF-16中,字符长度以16位开始。 UTF-8主要优点: 基本ASCII字符(例如数字,不带重音的拉丁字符等)占据一个字节,与US-ASCII表示形式相同。这样,所

  • 我正在尝试使用iconv将UTF-16BE编码文件(字节顺序标记:0xFE 0xFF)转换为UTF-8,如下所示: 然而,结果输出具有UTF-8字节顺序标记(0xEF 0xBB 0xBF),这不是我需要的。有没有办法告诉iconv(或者有等效的编码)不要在UTF-8结果中放入BOM?

  • 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将一个包含6个字符的字符串转换为字节时,我得到了6个字节,如下所示,我期望它是12。我是不是漏掉了什么概念? O/p:字符数组的长度为6 按照@Darshan的说法,当尝试使用UTF-16编码获取字节时,结果也不是预期的。

  • 问题内容: 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将包含6个字符的字符串转换为字节时,我将得到如下所示的6个字节,但我希望它是12。是否缺少任何概念? O / p:字符数组的长度为6 根据@Darshan尝试使用UTF-16编码获取字节时,结果也不期望。 问题答案: 在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认)和L

  • 问题内容: 该JSON RFC,第2.5节,说部分: 为了转义不在“基本多语言平面”中的扩展字符,该字符表示为十二个字符的序列,对UTF-16代理对进行编码。因此,例如,仅包含G谱号字符(U + 1D11E)的字符串可以表示为“ \ uD834 \ uDD1E”。 假设我有合理的理由将JSON编码为UTF-16BE(允许)。这样做时,是否仍然需要转义基本多语言平面中没有的字符?例如,代替此: 这是

  • 问题内容: 现在考虑下面给出的代码: 当我尝试调试上面代码中的行时,调试器将我带到String类的方法中,然后将我带到StringCoding类的方法中。在调试过程中,encode方法的第一行()返回“ UTF-8”作为默认编码。我希望它是“ UTF-16”。 该程序的输出为: 最= 6700的Unicode值UTF-8字符=最| 默认值:字节数= 3 对应的UTF-16字符= UTF-16:字节