.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();