我正在为String
的大小创建一组测试来执行此操作我正在使用类似myString.getBytes("UTF-8").length > MAX_SIZE
的内容,其中java具有已检查的异常UnsupportedEncodingException
。
只是出于好奇,并进一步考虑其他可能的测试场景,是否存在无法用UTF-8字符编码表示的文本?
BTW:我完成了我的作业,但无处(我能找到)指明UTF-8 / Unicode确实包含了所有可能的字符。我知道它的大小是2 ^ 32,其中许多仍然是空的,但问题仍然存在。
答案 0 :(得分:3)
The official FAQ from the Unicode Consortium在这个问题上非常清楚,并且是与UTF-8,UTF-16等相关的所有问题的重要信息来源。
特别注意以下引用(强调我的):
问:什么是UTF?
答:Unicode转换格式(UTF)是一种 来自 每个 Unicode代码点的算法映射( 除了代理 代码点 )到唯一的字节序列。 ISO / IEC 10646标准 对UTF使用术语“UCS转换格式”;这两个词是 只是同一概念的同义词。
每个UTF都是可逆的,因此每个UTF都支持无损圆 跳闸:从 任何 Unicode编码的字符序列S映射到a 字节序列和返回将再次产生S.确保圆 跳闸,UTF映射必须映射 所有 代码点( 除了代理 代码点 )到唯一字节序列。这包括保留 (未分配的)代码点和66个非字符(包括U + FFFE 和U + FFFF)。
因此,正如您所看到的,根据定义,所有UTF编码(包括UTF-8)必须能够处理 所有 Unicode代码点(代理代码除外)当然,但他们不是真正的字符。)
此外,这里有一个直接来自Unicode Standard的引用,它也谈到了这个:
Unicode标准支持三种字符编码形式:UTF-32, UTF-16和UTF-8。每个编码形式都映射Unicode代码点 U + 0000..U + D7FF和U + E000..U + 10FFFF 到唯一代码单元序列。
如您所见,指定的字符范围涵盖整个指定的Unicode范围(当然不包括代理字符范围)。
答案 1 :(得分:0)
是否存在无法用UTF-8字符编码表示的文本?
Java字符串使用UTF-16,标准UTF-8用于处理 UTF-16可以处理的每个 Unicode代码点(然后是一些)。
但是,请注意,因为Java 在某些区域使用Modified UTF-8,并且与标准UTF-8有一些差异/限制。