C# Char:字符

C# 中字符(Char)是一个只有两个比较重要的字段(最小值和最大值)的结构体。

由于所有的信息最后都会被转换为二进制,因此,字符也有对应的二进制表示法。

在计算机科技的早期,使用计算机的开发者主要使用英语。

于是,他们将英语字符以及其他常用字符排了个序,共选出了 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

(0)
上一篇 2021年7月20日 10:37
下一篇 2021年7月20日 10:37

相关推荐

发表回复

登录后才能评论