字符、字符串和文本的處理之Char類型


.Net Framework中處理字符和字符串的主要有以下這么幾個類:

(1)、System.Char類 一基礎字符串處理類

(2)、System.String類 一處理不可變的字符串(一經創建,字符串便不能以任何方式修改)

(3)、System.Text.StringBuilder類 一更高效地構建字符串

(4)、System.Secureity.SecureString類 一對字符串進行保護操作,它可以保護密碼和信用卡資料等敏感字符串.

 

一、Char類型

Char是值類型,這點和String類型不同,因為String類型派生自object.

1、簡介

在.Net Framework中,字符總是表示成16位Unicode代碼值,這簡化了國際化應用程序的開發.每個字符都是System.Char結構(一個值類型)的實例.

 

(1)、常量屬性

Char提供了兩個公開的只讀常量字段,MinValue和MaxValue,分別為'\0'和'\uffff'.分別為最小和最大的字符值.

 

2、判斷字符的類型

(1)、通過GetUnicodeCategory()靜態方法來判斷當前字符的類型.該方法返回一個System.Globalization.UnicodeCategory枚舉類型的一個值,這個值是由Unicode標准定義的控制字符、貨幣符號、小寫字符、大寫字母、標點符號、數學字符還是其他符號,具體類型如下:

    //
    // 摘要:
    //     定義字符的 Unicode 類別。
    [ComVisible(true)]
    public enum UnicodeCategory
    {
        //
        // 摘要:
        //     大寫字母。 由 Unicode 代碼“Lu”(字母,大寫)表示。 值為 0。
        UppercaseLetter = 0,
        //
        // 摘要:
        //     小寫字母。 由 Unicode 代碼“Ll”(字母,小寫)表示。 值為 1。
        LowercaseLetter = 1,
        //
        // 摘要:
        //     詞首字母大寫的字母。 由 Unicode 代碼“Lt”(字母,詞首字母大寫)表示。 值為 2。
        TitlecaseLetter = 2,
        //
        // 摘要:
        //     修飾符字母字符,它是獨立式的間距字符,指示前面字母的修改。 由 Unicode 代碼“Lm”(字母,修飾符)表示。 值為 3。
        ModifierLetter = 3,
        //
        // 摘要:
        //     不屬於大寫字母、小寫字母、詞首字母大寫或修飾符字母的字母。 由 Unicode 代碼“Lo”(字母,其他)表示。 值為 4。
        OtherLetter = 4,
        //
        // 摘要:
        //     指示基字符的修改的不占位字符。 由 Unicode 代碼“Mn”(符號,不占位)表示。 值為 5。
        NonSpacingMark = 5,
        //
        // 摘要:
        //     間隔字符,它指示基字符的修改並影響基字符的標志符號的寬度。 由 Unicode 代碼“Mc”(符號,間隔組合)表示。 值為 6。
        SpacingCombiningMark = 6,
        //
        // 摘要:
        //     封閉符號字符,它是將基字符前面的所有字符(包括基字符)括起來的不占位字符。 由 Unicode 代碼“Me”(符號,封閉)表示。 值為 7。
        EnclosingMark = 7,
        //
        // 摘要:
        //     十進制數字字符,即范圍 0 到 9 內的字符。 由 Unicode 代碼“Nd”(數字,十進制數字)表示。 值為 8。
        DecimalDigitNumber = 8,
        //
        // 摘要:
        //     由字母表示的數字,而不是十進制數字,例如,羅馬數字 5 由字母“V”表示。 此指示符由 Unicode 代碼“Nl”(數字,字母)表示。 值為 9。
        LetterNumber = 9,
        //
        // 摘要:
        //     既不是十進制數字也不是字母數字的數字,例如分數 1/2。 此指示符由 Unicode 代碼“No”(數字,其他)表示。 值為 10。
        OtherNumber = 10,
        //
        // 摘要:
        //     沒有標志符號但不屬於控制或格式字符的空格字符。 由 Unicode 代碼“Zs”(分隔符,空格)表示。 值為 11。
        SpaceSeparator = 11,
        //
        // 摘要:
        //     用於分隔文本各行的字符。 由 Unicode 代碼“Zl”(分隔符,行)表示。 值為 12。
        LineSeparator = 12,
        //
        // 摘要:
        //     用於分隔段落的字符。 由 Unicode 代碼“Zp”(分隔符,段落)表示。 值為 13。
        ParagraphSeparator = 13,
        //
        // 摘要:
        //     控制代碼字符,其 Unicode 值為 U+007F,或者屬於 U+0000 到 U+001F 或 U+0080 到 U+009F 的范圍內。 由 Unicode
        //     代碼“Cc”(其他,控制)表示。 值為 14。
        Control = 14,
        //
        // 摘要:
        //     格式字符,它影響文本的布局或文本處理操作,但通常不呈現。 由 Unicode 代碼“Cf”(其他,格式)表示。 值為 15。
        Format = 15,
        //
        // 摘要:
        //     高代理項或低代理項字符。 代理項代碼值在 U+D800 到 U+DFFF 的范圍內。 由 Unicode 代碼“Cs”(其他,代理項)表示。 值為 16。
        Surrogate = 16,
        //
        // 摘要:
        //     專用字符,其 Unicode 值在在 U+E000 到 U+F8FF 的范圍內。 由 Unicode 代碼“Co”(其他,專用)表示。 值是 17。
        PrivateUse = 17,
        //
        // 摘要:
        //     連接兩個字符的連接符標點字符。 由 Unicode 代碼“Pc”(標點,連接符)表示。 值為 18。
        ConnectorPunctuation = 18,
        //
        // 摘要:
        //     短划線或連字符字符。 由 Unicode 代碼“Pd”(標點,短划線)表示。 值為 19。
        DashPunctuation = 19,
        //
        // 摘要:
        //     成對的標點符號(例如括號、方括號和大括號)的開始字符。 由 Unicode 代碼“Ps”(標點,開始)表示。 值為 20。
        OpenPunctuation = 20,
        //
        // 摘要:
        //     成對的標點符號(例如括號、方括號和大括號)的結束字符。 由 Unicode 代碼“Pe”(標點,結束)表示。 值為 21。
        ClosePunctuation = 21,
        //
        // 摘要:
        //     左引號或前引號字符。 由 Unicode 代碼“Pi”(標點,前引號)表示。 值為 22。
        InitialQuotePunctuation = 22,
        //
        // 摘要:
        //     右引號或后引號字符。 由 Unicode 代碼“Pf”(標點,后引號)表示。 值為 23。
        FinalQuotePunctuation = 23,
        //
        // 摘要:
        //     不屬於連接符、短划線、開始標點、結束標點、前引號或后引號的標點字符。 由 Unicode 代碼“Po”(標點,其他)表示。 值為 24。
        OtherPunctuation = 24,
        //
        // 摘要:
        //     數學符號字符,如“+”或“=”。 由 Unicode 代碼“Sm”(符號,數學)表示。 值為 25。
        MathSymbol = 25,
        //
        // 摘要:
        //     貨幣符號字符。 由 Unicode 代碼“Sc”(符號,貨幣)表示。 值為 26。
        CurrencySymbol = 26,
        //
        // 摘要:
        //     修飾符符號字符,它指示環繞字符的修改。 例如,分數斜線號指示其左側的數字為分子,右側的數字為分母。 此指示符由 Unicode 代碼“Sk”(符號,修飾符)表示。
        //     值為 27。
        ModifierSymbol = 27,
        //
        // 摘要:
        //     不屬於數學符號、貨幣符號或修飾符符號的符號字符。 由 Unicode 代碼“So”(符號,其他)表示。 值為 28。
        OtherSymbol = 28,
        //
        // 摘要:
        //     未分配給任何 Unicode 類別的字符。 由 Unicode 代碼“Cn”(其他,未分配)表示。 值為 29。
        OtherNotAssigned = 29
    }

 

該方法有兩種傳參方式,如下:

        //
        // 摘要:
        //     將指定字符串中位於指定位置的字符分類到由一個 System.Globalization.UnicodeCategory 值標識的組中。
        //
        // 參數:
        //   s:
        //     System.String。
        //
        //   index:
        //     s 中的字符位置。
        //
        // 返回結果:
        //     一個 System.Globalization.UnicodeCategory 枚舉常數,標識包含 index 中位於 s 處的字符的組。
        //
        // 異常:
        //   T:System.ArgumentNullException:
        //     s 為 null。
        //
        //   T:System.ArgumentOutOfRangeException:
        //     index 小於零或大於 s 中最后一個位置。
        public static UnicodeCategory GetUnicodeCategory(string s, int index);
        //
        // 摘要:
        //     將指定的 Unicode 字符分類到由一個 System.Globalization.UnicodeCategory 值標識的組中。
        //
        // 參數:
        //   c:
        //     要分類的 Unicode 字符。
        //
        // 返回結果:
        //     一個 System.Globalization.UnicodeCategory 值,它標識包含 c 的組。
        public static UnicodeCategory GetUnicodeCategory(Char c);

測試代碼如下:

判斷目標字符是否是空格符

var chatType=Char.GetUnicodeCategory(' ');
//判斷' '是否是一個空格符
var isEqual = chatType.Equals(UnicodeCategory.SpaceSeparator);
Console.WriteLine(isEqual);

輸出:True

判斷目標字符是否是大寫字母

var chatType=Char.GetUnicodeCategory('S');
//判斷'S'是否是一個大寫字母
var isEqual = chatType.Equals(UnicodeCategory.UppercaseLetter);
Console.WriteLine(isEqual);

輸出:True

 

(3)、為了簡化開發,Char類型還提供了幾個靜態方法,如下:

IsDigit()、IsLetter()、IsUpper()、IsLower()、IsPunctuaion()等方法.大多數都在內部調用了GetUnicodeCategory方法,並返回true和false;

 

3、字符轉大小寫

(1)、忽略語言文化的字符大小寫轉換

通過Char的ToUpperInvariant和ToLowerInvariant靜態方法可完成忽略語言文化的字符的大小寫轉換,代碼如下:

var lower = Char.ToLowerInvariant('S');
var upper = Char.ToUpperInvariant('s');
Console.WriteLine("s的小寫形式:{0},s的大寫形式:{1}",lower,upper);

 

(2)、不忽略語言文化的字符大小寫轉換

通過Char的ToLower和ToUpper方法來轉換大小寫,但轉換時調用線程關聯的語言文化信息(方法在內部查詢)System.Threading.Thread類的靜態屬性CurrentCultrue屬性來獲取,代碼如下:

var lower = Char.ToLower('s', Thread.CurrentThread.CurrentCulture);
var upper = Char.ToUpper('S', Thread.CurrentThread.CurrentCulture);
Console.WriteLine("s的小寫形式:{0},s的大寫形式:{1}",lower,upper);

ToUpper和ToLower之所以需要文化信息,是因為字母的大小寫轉化是一種依賴於語言文化的操作.

每種語言轉換字母的方式不同.

 

3、判斷字符是否相等

(1)、通過Char的實例Equals方法來判斷

Console.WriteLine("字符{0}和字符{1}相等?答案:{2}", 's', 's', 's'.Equals('s'));

 

(2)、判斷兩個字符的大小

通過Char的實例CompareTo方法(該方法由IComparable和IComparable<Char>接口來定義)來判斷,結果返回兩個Char實例的忽略語言文化的比較結果.

Console.WriteLine("字符{0}和字符{1}相差的位置?答案:{2}", 's', 's', 'b'.CompareTo('a'));
Console.WriteLine("字符{0}和字符{1}相差的位置?答案:{2}", 's', 's', 'a'.CompareTo('b'));

 

 

4、ConvertToUtf32方法和ConvertFromUtf32方法

自行百度

 

5、返回字符的數值形式

通過GetNumericValue()將字符轉換成數字,這個方法將返回字符的數字形式.代碼如下:

Console.WriteLine(Char.GetNumericValue('\u0039'));//9的二進制代碼
Console.WriteLine(Char.GetNumericValue('9'));
Console.WriteLine(Char.GetNumericValue('a'));

如果目標字符串不是數字返回-1;

 

6、字符轉換數值其他的方法

(1)、強制類型轉換

將Char轉換成數值例如int32最簡單的方法就是轉型.這是三種方法中效率最高的,因為編譯器會生成中間語言(IL)指令來執行轉換,而且不必調用方法.且C#允許指定轉換時使用checked還是unchecked代碼,C# checked和unchecked詳解

 

(2)、使用Convert類型

System.Convert類型提供的幾個靜態方法來實現Char和數值類型的相互轉換,所有的這些轉換都以checked方式執行,發現轉換造成數據丟失就拋出OverflowException異常.

 

(3)、使用IConvertible接口

Char類型和FCL中的所有數值類型都實現了IConvertible接口.該接口定義了像ToUint32和ToChar這樣的方法,這種技術效率最差,因為在值類型上調用接口方法要求對實例進行裝箱一Char和所有數值類型都是值類型.如果某個類型不能轉換(比如Char轉換成Boolean),或者轉換造成數據丟失,IConvertible的方法會拋出System.InvalidCastException異常.注意,許多類型(包括FCL的Char和數值類型)都將IConvertible的方法實現為顯式成員接口,這意味着為了調用接口的任何方法,都必須先將實例顯式轉型為一個IConvertible.IConvertible的所有方法(GetTypeCode除外)都接受對實現了IFormatProvider接口的一個對象的引用.如果轉換時需要考慮語言文化信息,該參數就很有用.但大多數時候可以忽略語言文化,為這個參數傳遞null值.

 

(4)、示例代碼

            var c = (char)65;
            Console.WriteLine(c);

            var n = (int)c;
            Console.WriteLine(n);

            c = unchecked((char)(65536+65));
            Console.WriteLine(c);

            n = Convert.ToInt32(c);
            Console.WriteLine(n);

            //Convert的范圍檢查
            try
            {
                c = Convert.ToChar(70000);//對於16位來說過大
                Console.WriteLine(c); //不執行,上面的異常被catch
            }
            catch (OverflowException)
            {
                Console.WriteLine("Can't convert 70000 to a Char.");
            }

            c = ((IConvertible)65).ToChar(null); //可以傳遞一個IFormatProvider參數,但是大多數情況下不需要,應為大多數情況下可以忽略語言文化
            Console.WriteLine(c);

            n = ((IConvertible)c).ToInt32(null);
            Console.WriteLine(n);

            Console.ReadKey();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM