哪个字符不在 UTF-16 中?

Which char is not in UTF-16?

我需要一些 UTF-16 不支持的字符。我找不到他们。 你能帮帮我吗?

char[] letters = tbvstup.Text.ToCharArray();
for (int i = 0; i < letters.Length; i++)
{
    if(letters[i] == 'ě' || letters[i] == 'č' || letters[i] == 'ř' || letters[i] == 'ť' || letters[i] == 'ď' || letters[i] == 'ň' || letters[i] == 'ů')
    {
        ASCII = false;
        pbascii.BackColor = Color.Red;
    }
    if (letters[i] == '˛' || letters[i] == '˘' || letters[i] == 'ˇ' || letters[i] == '˙' || letters[i] == '€' || letters[i] == '‡' || letters[i] == '‰' || letters[i] == 'ě' || letters[i] == 'č' || letters[i] == 'ř' || letters[i] == 'ť' || letters[i] == 'ď' || letters[i] == 'ň' || letters[i] == 'ů')
    {
        ISO = false;
        pbiso.BackColor = Color.Red;   
    }
    if (letters[i] == '€')
    {
        CP852 = false;
        pbcp852.BackColor = Color.Red;
    }
    if (letters[i] == '£')
    {
        CP1250 = false;
        pbcp1250.BackColor = Color.Red;
    }
    if (letters[i] == '') // <-- What do I need to put here?
    {
        UTF16 = false;
        pbutf16.BackColor = Color.Red;
    }
}

ASCII 是一种 7 位编码,其中字符代码和存储的字节之间存在 1:1 关系。

CP852CP1250 和其他人使用了额外的位(与 ASCII 相比),因此它们有 128 个额外的值来编码额外的字符。他们可能会重新定义一些较低的 128 值。字符和存储的字节之间仍然存在1:1关系,如:如果它不适合一个字节,它就不能在这个代码页中(这就是为什么有这么多代码页)。

UTF-8UTF-16 非常不同。它们属于 Unicode 字符集,该字符集将 唯一 数字分配给任何语言(现代或古代 - 甚至象形文字都有自己的 set of values)的任何字符。 unicode 值(代码点)不限制自己适合某些位数,因为这是编码的工作:UTF-8 使用 8 位单位(也称为字节)并且(对于英语)主要使用每个字符一个字节,但根据需要最多可以使用六个字节。 UTF-16 使用 16 位单元,可能需要其中两个来编码特定代码点。

因此没有不能用 UTF-16 编码的有效字符(由 unicode 定义),尽管较高值的字符可能需要两个 16 位单元 ("surrogate pair")。

C#(.Net,实际上)使用 16 位 char 数据类型,因此实际上在内部使用 UTF-16。

查看更多信息:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets