java - UTF-16 编码的错误字节
问题描述
我有一个字符 '' Unicode 值是U+1F62D二进制等效值是11111011000101101。现在我想将此字符转换为字节数组。我的脚步
1)由于二进制表示大于 2 个字节,我使用 4 个字节
XXXXXXX XXXXXXX1 11110110 00101101
2) 现在我将所有的 'X' 替换为 '0'
00000000 00000001 11110110 00101101
3) 十进制等值
00000000(0) 00000001(1) 11110110(-10) 00101101(45)
这是我的代码
@Test
public void testUtf16With4Bytes() throws Exception {
assertThat(
new String(
new byte[]{0,1,-10,45},
StandardCharsets.UTF_16BE
),
is("")
);
}
这是输出
ava.lang.AssertionError:
Expected: is ""
but: was ""
我错过了什么 ?
解决方案
您错过了一些 UTF 字符存储为代理对:
在 UTF-16 中,U+0000-U+D7FF 和 U+E000-U+FFFD 范围内的字符存储为单个 16 位单元。非 BMP 字符(范围 U+10000—U+10FFFF)存储为“代理对”,两个 16 位单元:一个高代理(在 U+D800-U+DBFF 范围内)后跟一个低代理(在 U 范围内) +DC00—U+DFFF)。一个单独的代理字符在 UTF-16 中是无效的,代理字符总是成对写入(高后低)。
性格U+1F62D
如此,它落入U+10000—U+10FFFF
范围。它用代理对表示U+D83D
U+DE2D
,就像byte[]
它一样[-40, 61, -34, 45]
。
推荐阅读
- css - 我可以在一个项目中拥有一个可以在多个项目中导入的通用 SCSS
- visual-studio - 如何在 Xamarin Visual Studio 2019 中分析应用程序性能
- python - 我的 Cython 代码与 Python 交互过多
- react-native - 换行(多行)按钮
- python - 为什么我的数据框在连接时会创建新行?
- azure - 在运行 az cosmosdb create 命令创建 Cosmos DB 帐户时如何指定 MongoDB API 版本?
- angular - 我们可以从Angular 8中的孙子组件访问数据吗
- react-router-dom - 防止复制的 url 重定向到 /
- javascript - 如何使用 axios 获取多个 api?
- rest - 从 Netsuite Web 服务 (Suitetalk) 请求销售订单数据