代码之家  ›  专栏  ›  技术社区  ›  Alexandru

使用编码映射到奇数字节的字符。Unicode

  •  0
  • Alexandru  · 技术社区  · 6 年前

    我知道在某些情况下,一些字符在使用时会占用更多的空间 Encoding.Unicode.GetBytes()

    var value = Encoding.Unicode.GetBytes("🌀"); ,为此 value.Length

    这不同于:

    var value = Encoding.Unicode.GetBytes("a"); ,为此 值.长度 是2。

    不过,我真的很好奇。有没有可能想出一组字符 编码.Unicode.GetBytes() 要返回奇数字节,可以使用组合字符或其他方式?如果是,有人能给我举一个这样的例子吗?如果不是,那是为什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexandru    6 年前

    根据 UTF-16

    U+0000到U+D7FF:2字节。

    U+E000到U+FFFF:2字节。

    var value = Encoding.Unicode.GetBytes("\uD800"); 还要注意,使用 var str = Encoding.Unicode.GetString(value); 不会给你同样的结果!

    特别说明 :虽然是一个字符,但实际上它是以两个字符存储在C字符串中的。以下情况属实: Debug.Assert("🌀".Length == 2); 小心!

    U+110000及以上:不应编码,也似乎不在C#中编码。例如,这不起作用: var str = "\U00110000";

    如果我们假设任何给定的字符分别占用2或4个字节(由于编码器的行为,我现在还不能确定这个字节),那么接下来简单的数学证明两个偶数除以两个仍然是偶数。偶数是2的倍数,写为: 2m + 2n

    上面的公式总是可以被2整除,如 (2m + 2n) / 2 = m + n

        2
  •  0
  •   ForeverZer0    6 年前

    我认为在代码点和字节数上,或者在如何组合字符来创建字符串上,您可能有点误导。有 2**16

    Unicode有“平面”来描述字符(为了解决这个问题,假设UTF-16,因为这些范围随UTF-8和UTF-32的变化而变化)。字节的特定组合创建“对”,虽然它们仍然表示一个字符,但实际上需要4个字节来描述。

    在UTF-16中,这些字符的码位值高于 0x00FFFF

    因此,虽然字节数可能略有变化(尽管可以预见),但值始终是偶数,它们要么是2,要么是4。