当前位置: 首页 > 面试题库 >

如何使用BOM编码/解码UTF-16LE字节数组?

江超英
2023-03-14
问题内容

我需要对UTF-16字节数组进行编码/解码java.lang.String。字节数组是通过字节顺序标记(BOM)给我的,我需要使用BOM编码字节数组。

另外,由于我正在与Microsoft客户端/服务器打交道,因此我希望以小字节序(与LE
BOM一起)发出编码,以避免任何误解。我确实意识到,使用BOM可以在大端模式下工作,但是我不想在Windows世界中游走。

例如,以下是一种使用BOM 编码java.lang.StringUTF-16little endian 的方法:

public static byte[] encodeString(String message) {

    byte[] tmp = null;
    try {
        tmp = message.getBytes("UTF-16LE");
    } catch(UnsupportedEncodingException e) {
        // should not possible
        AssertionError ae =
        new AssertionError("Could not encode UTF-16LE");
        ae.initCause(e);
        throw ae;
    }

    // use brute force method to add BOM
    byte[] utf16lemessage = new byte[2 + tmp.length];
    utf16lemessage[0] = (byte)0xFF;
    utf16lemessage[1] = (byte)0xFE;
    System.arraycopy(tmp, 0,
                     utf16lemessage, 2,
                     tmp.length);
    return utf16lemessage;
}

用Java做到这一点的最佳方法是什么?理想情况下,我想避免将整个字节数组复制到一个新的字节数组中,该数组在开始时分配了两个额外的字节。

解码这样的字符串也是如此,但是使用java.lang.String构造函数会更直接:

public String(byte[] bytes,
              int offset,
              int length,
              String charsetName)

问题答案:

“ UTF-16”字符集名称将始终使用BOM进行编码,并且将使用大/小端顺序对数据进行解码,但是“ UnicodeBig”和“
UnicodeLittle”可用于按特定字节顺序进行编码。不使用BOM表使用UTF-16LE或UTF- 16BE-有关如何使用“ \
uFEFF”手动处理BOM表的信息,请参阅此文章。有关字符集字符串名称或(最好是)字符集类的规范命名,请参见此处。还要注意,绝对只需要支持有限的编码子集。



 类似资料:
  • 这是我第一次用MSSQLServer作为数据库为我的项目实现Liquibase(3.8.1版)。 我正在尝试为现有的sql server数据库设置基线,该数据库包含许多表、视图、存储过程和函数。 我成功地为表格生成了Angelog。 由于我所做的有很多存储过程、视图和函数,所以我从MSSQLSERVER生成了SQL脚本- 在使用liquibase update执行上述更改日志时,我收到错误“运行l

  • 当从UTF-16LE转换到UTF-16时,字符是否会被更改/丢失?在java中有没有一种方法可以做到这一点,并确保输入与输出完全相同?

  • 根据统一码规范 D91 UTF-16 编码形式:在 U 0000..U D7FF 和 U E000 范围内分配每个 Unicode 标量值的 Unicode 编码形式。U FFFF 到与 Unicode 标量值具有相同数值的单个无符号 16 位代码单元,并将 U 10000..U 10FFFF 范围内的每个 Unicode 标量值分配给代理项对。 术语“标量值”是指 Unicode 码位,即必须通

  • 问题内容: 我遇到了一些有关JVM / JIT活动的参考,其中似乎在编译字节码和解释字节码之间有区别。该特定注释声明的字节码在前10000次运行时进行解释,然后进行编译。 “编译”和“解释”字节码之间有什么区别? 问题答案: 解释字节码基本上是逐行读取字节码,不进行任何优化或任何操作,然后对其进行解析并实时执行。由于许多原因,这种方法效率低下,其中包括Java字节码设计得不能快速解释的问题。 编译

  • 本章是由 Alex Cabal 最初撰写在 PHP Best Practices 中的,我们使用它作为进行建议的基础。 这不是在开玩笑。请小心、仔细并且前后一致地处理它。 目前,PHP 仍未在底层实现对 Unicode 的支持。虽然有很多途径可以确保 UTF-8 字符串能够被正确地处理,但这并不是很简单的事情,通常需要对 Web 应用进行全方面的检查,从 HTML 到 SQL 再到 PHP。我们将

  • 下面的代码为我提供了一个 UnicodeDecodeError:'utf-8'编解码器无法解码位置1的字节0xdb:无效的延续字节 类似的帖子也无济于事。