由于所有的信息最后都会被转换为二进制,因此,字符也有对应的二进制表示法。
在计算机科技的早期,使用计算机的开发者主要使用英语。
于是,他们将英语字符以及其他常用字符排了个序,共选出了 128 个常用字符。
这样,每个字符都可以映射到一个字节,例如 A 对应65,k 对应 107,而空格对应32。
这套编码就叫做 ASCII 码。现在,你依然可以通过将字符转换为整数来判断字符是否为一个英文字符。
下面的代码就是字符的定义,它是一个结构体,包括了最小和最大值,另外,m_value 储存了它的值。
[Serializable] [ComVisible(true)] [__Dynamicallylnvokable] public struct Char : IComparable, IConvertible, IComparable<char>, IEquatable<char> { internal char m_vaLue; [__Dynamicallylnvokable] public const char MaxValue = '/uffff'; [__Dynamicallylnvokable] public const char MinValue = '/0'; private static readonly byte[] categoryForLatin1 = new byte[256] ...; internal const int UNICODE_PLANE00_END = 65535; internal const int UNICODE_PLANE01_START = 65536; internal const int UNICODE_PLANE16_END = 1114111; internal const int HIGH_SURROGATE_START = 55296; internal const int LOW_SURROGATE_END = 57343;
由于一个字节含有八位,所以,理论上它可以表示 256 种不同的信息,而英语只有 26 个字母,即使加上大小写也才 52 个。再加上各种符号,128 个字符也够了。
于是,后来的其他语言如法语,将它们特有的字母加入128-255 这段空置的码表中:显然,不同的语言,128〜255 这段的符号都是不同的,这就造成了不同的编码方式。
而且,对于一些比较特殊的语言如中文,它可是有几千个常用字符。因此,一个字节是肯定不够表示一个汉字的。
为了解决不同编码方式带来的问题,Unicode 编码应运而生。它的解决方法非常简单粗暴,就是试图将世界上所有的文字和符号通通塞进一张庞大的代码表。
当然,打头的 128 个便是 ASCII 码了,至于后面的,怎么排法不重要,反正大家都有位置。
我们知道,两个字节可以表示 256*256=65536 个不同字符,通常来说,这已经可以解决绝大部分语言的绝大部分字符了。
不过,还是会有一些生僻的字符,需要扩展的 Unicode 编码,其长度为四个字节(约 42.9 亿,绝对够了! )。
因此,不同国家地区的人们肆无忌惮地将字符放入编码表, 现在的 Unicode 编码表已经有了 100 多万个成员。
在 C# 中,每一个 char 都是范围介于 U+0000 至 U+FFFF 的 Unicode 字符,单个 char 占用两个字节(一个字节明显不够),即一个 16 位的 Unicode 字符。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/22379.html