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

Ord*_*iel 5 java unicode utf-8 character-encoding

我正在为 a 的大小创建一组测试String,因此我正在使用类似这样的东西myString.getBytes("UTF-8").length > MAX_SIZE,其中 java 有一个已检查的异常UnsupportedEncodingException

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

顺便说一句:我做了功课,但没有任何地方(我能找到)指定 UTF-8/Unicode 确实包含所有可能的字符。我知道它的大小是 2^32 并且其中许多仍然是空的,但问题仍然存在。

sst*_*tan 4

Unicode 联盟的官方常见问题解答在这个问题上非常清楚,并且是与 UTF-8、UTF-16 等相关的所有问题的重要信息来源。

\n

特别要注意以下引用(强调我的):

\n
\n

问:什么是UTF?

\n

答:Unicode 转换格式 (UTF) 是从每个Unicode 代码点(代理代码点除外)到唯一字节序列的\n算法映射。ISO/IEC 10646 标准\使用术语\xe2\x80\x9cUCS 转换格式\xe2\x80\x9d 表示UTF;这两个术语只是同一概念的同义词。

\n

每个 UTF 都是可逆的,因此每个 UTF 都支持无损往返:从任何Unicode 编码的字符序列 S 映射到字节序列并返回将再次产生 S。为了确保往返,UTF 映射必须将所有代码点(代理代码点除外)映射到唯一的字节序列。这包括保留\n(未分配)代码点和 66 个非字符(包括 U+FFFE\n 和 U+FFFF)。

\n
\n

因此,正如您所看到的,根据定义,所有 UTF 编码(包括 UTF-8)必须能够处理所有Unicode 代码点(当然代理代码点除外,但它们不是真正的)字符)。

\n

此外,这里直接引用了Unicode 标准,也讨论了这一点:

\n
\n

Unicode 标准支持三种字符编码形式:UTF-32、\nUTF-16 和 UTF-8。每种编码形式都映射 Unicode 代码点\n U+0000..U+D7FF 和 U+E000..U+10FFFF映射到唯一的代码单元序列。

\n
\n

正如您所看到的,指定的字符范围涵盖了整个指定的 Unicode 范围(当然不包括代理字符范围)。

\n