C# Char:字元

2020-07-16 10:04:47
在 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 = '';
    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 字元。