UTF-8 内容在 Java 中是否格式错误

Does UTF-8 content could be malformed in Java

提问人:Kevin Patel 提问时间:9/3/2023 最后编辑:Kevin Patel 更新时间:9/3/2023 访问量:81

问:

我正在尝试在 java 中创建一个测试用例来测试

decoder.onMalformedInput(CodingErrorAction.REPLACE);
decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);

我需要UTF_8字符集中的一些字符来测试它们。

Java UTF-8 编码 -解码器 字符集

评论

1赞 user22471702 9/3/2023
UTF-8,afaik,不是一个字符集,而只是一个字符编码标准 - 你需要像Wikipeida中解释的那样的东西吗:无效的序列和错误处理
1赞 Sören 9/3/2023
这回答了你的问题吗?如何从CharsetDecoder的.decode()生成UnmappableCharacterException?
1赞 g00se 9/3/2023
格式错误的输入将是任何错误编码为 UTF-8 的输入。因此,任何0x7F 0xFF的角色都应该这样做。以 8 位编码编码的变音符号字符将是一个不错的选择char
0赞 VGR 9/3/2023
@user22471702 长期以来,“charset”一词一直被用作字符编码的同义词,在 Java 中、原始 MIME 定义和 UTF-8 定义中。
1赞 Giacomo Catenazzi 9/4/2023
尝试一些常见的用例: 不是 UTF-8 字节(例如在损坏的文件中):在某处添加0xFF。删除一个字节(在非 ASCII 部分上),这样你就会有问题。添加过长的序列(通常将 \x00 编码为两个字节(因此不要在字符串中包含 \x00。对代理项进行编码(作为代码点)。使用无效字符(非字符)。对于测试:使用未分配的代码

答:

2赞 Basil Bourque 9/3/2023 #1

TL的;博士

UTF-8 几乎可以表示地球上的任何字符,即 Unicode 中的所有字符。

如果您要询问 UTF-8 内容示例是否格式不正确,是的,可以。以违反维基百科中描述的规则的方式放下一些位。我认为这会触发你的,但我没有尝试过。onMalformedInput

Unicode 中大多数可能的码位尚未分配给任何字符。其中一些被留作“私人使用”克林贡语等)。其中一些是保留给将来使用的。也许包含任何保留供将来使用的代码点的 UTF-8 编码文本会触发您的 ,但我没有尝试过。onUnmappableCharacter

字符集未包含的任何字符UTF_8

你混淆了两件不同的事情:

  • 字符是字符的集合,每个字符由一个称为代码点的分配编号标识。此集合可能包含一种人类语言或多种人类语言的字符。
  • 字符编码是一种通过记录特定字符集中字符的码位和字节来表示该文本集的某些文本的方法。

Unicode 是一个字符集,旨在表示所有现存的和最具学术意义的死语言的字符。Unicode 是所有其他字符集组合的超集。目前,Unicode 15 已识别 149,186 个字符。每个字符都被分配了一个代码点编号,范围从零到一百万多一点。

UTF-8 是一种字符编码,它使用一个或多个八位字节来表示每个分配的数字。UTF-8 可以表示 Unicode 可分配的超过 100 万个可能的数字中的任何一个。

因此,您很难找到地球上大多数民族使用的任何字符,但尚未在Unicode中列出。所有这些字符都可以用 UTF-8 编码。