编码代码点
Encode a codepoint
我有一个 Unicode 代码点,它可以是 任何东西:可能是 ASCII,可能是 BMP 中的东西,也可能是异国情调的表情符号,例如 U+1F612。
我希望有一种简单的方法可以获取代码点并将其编码为字节数组,但我找不到简单的方法。我可以将它变成一个字符串,然后对其进行编码,但这是一种迂回的方式,涉及首先将其编码为 UTF-16,然后将其重新编码为所需的编码。我想直接编码成字节。
public static byte[] encodeCodePoint(int codePoint, Charset charset) {
// Surely there's got to be a better way than this:
return new StringBuilder().appendCodePoint(codePoint).toString().getBytes(charset);
}
确实无法避免使用 UTF-16,因为 Java 将 UTF-16 用于文本数据,而这正是字符集转换器的设计目的。但是,这并不意味着您必须对 UTF-16 数据使用 String
:
public static byte[] encodeCodePoint(int codePoint, Charset charset) {
char[] chars = Character.toChars(codePoint);
CharBuffer cb = CharBuffer.wrap(chars);
ByteBuffer buff = charset.encode(cb);
byte[] bytes = new byte[buff.remaining()];
buff.get(bytes);
return bytes;
}
我有一个 Unicode 代码点,它可以是 任何东西:可能是 ASCII,可能是 BMP 中的东西,也可能是异国情调的表情符号,例如 U+1F612。
我希望有一种简单的方法可以获取代码点并将其编码为字节数组,但我找不到简单的方法。我可以将它变成一个字符串,然后对其进行编码,但这是一种迂回的方式,涉及首先将其编码为 UTF-16,然后将其重新编码为所需的编码。我想直接编码成字节。
public static byte[] encodeCodePoint(int codePoint, Charset charset) {
// Surely there's got to be a better way than this:
return new StringBuilder().appendCodePoint(codePoint).toString().getBytes(charset);
}
确实无法避免使用 UTF-16,因为 Java 将 UTF-16 用于文本数据,而这正是字符集转换器的设计目的。但是,这并不意味着您必须对 UTF-16 数据使用 String
:
public static byte[] encodeCodePoint(int codePoint, Charset charset) {
char[] chars = Character.toChars(codePoint);
CharBuffer cb = CharBuffer.wrap(chars);
ByteBuffer buff = charset.encode(cb);
byte[] bytes = new byte[buff.remaining()];
buff.get(bytes);
return bytes;
}