无法用UTF-8表示的字符串

时间:2016-07-12 00:55:23

标签: java unicode utf-8 character-encoding

我正在为String的大小创建一组测试来执行此操作我正在使用类似myString.getBytes("UTF-8").length > MAX_SIZE的内容,其中java具有已检查的异常UnsupportedEncodingException

只是出于好奇,并进一步考虑其他可能的测试场景,是否存在无法用UTF-8字符编码表示的文本?

BTW:我完成了我的作业,但无处(我能找到)指明UTF-8 / Unicode确实包含了所有可能的字符。我知道它的大小是2 ^ 32,其中许多仍然是空的,但问题仍然存在。

2 个答案:

答案 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有一些差异/限制。