在.net framework中,字符总是表示成16位的unicode的代码值,每个字符都表示成System.Char结构的一个实例,而采用国际通用的unicode字符,正好可以适用国际的环境。
System.char类型非常简单,它提供了两个公共的只读常量字段:
MInValue(定义成'\0') MaxValue(定义成'\uffff')
针对char的一实例,可以调用静态的GetUnicodeCategory方法,这个方法返回的是system.Globalization.UnicodeCategory枚举类型的一个值,该值指示该字符是控制字符,货币符号,小写字母,大写字母还是标点符号,数学符号,也或是其他字符。
为了简化开发,char类型还提供了几个静态的方法,比如IsDigit, IsLetter, IsUpper, Islower, IsPunctuation, IsLetterOrDigit, IsControl, IsNumber, IsSeparate, IsSurrogate, IsLowSurrogate,I sHighSurrgate 和 IsSymbol 等,其中大多数方法都在内部调用了GetUnicodeCategory方法,并简单返回true和false。
另外,可调用静态方法ToLowerInvariant或者ToUpperInvariant,以一种忽略文化(Culture)的方式将一个字符转换为小写或者写形式。作为一种替代方案,也可使用ToLower和ToUpper方法转换为大写或者小写的形式,但这两个方法调用时要使用与调用线程关联的语言文化信息。之所以需要这种文化信息,是因为大小写转换是一种依赖于文化的一种操作。
其他方法:Equals方法会在两个Char实例 代表同一个人6位Unicode码位的前提下返回true,
CompareTo方法返回两个实例互略语言文化特性的比较结果。
ComvertFromUtf32方法获取一个UTF_32字符,并返回一个或者两个UTF_16字符构成的字符串
ComvertToUtf32方法获取一对低/高代理项字符,或者获取一个字符串,并返回一个UTF码位(int32值)
ToString方法返回由单个字符构成的的一个String。
最后一个是GetNumberValue,它返回字符的数值形式。以下给出示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { char c='a'; Console.WriteLine(Char.IsDigit(c));//显示false Console.WriteLine(Char.IsLetter(c));//显示true Console.WriteLine(Char.IsControl(c));//显示false Console.WriteLine(Char.IsHighSurrogate(c));//显示false Console.WriteLine(Char.IsLetterOrDigit(c));//显示true Console.WriteLine(Char.IsLower(c));//显示true Console.WriteLine(Char.IsPunctuation(c));//显示false Console.WriteLine(Char.IsSeparator(c));//显示false Console.WriteLine(Char.IsSymbol(c));//显示false Console.WriteLine(Char.GetUnicodeCategory(c));//显示lowcaseLetter Console.WriteLine(Char.ToUpperInvariant(c));//显示A Console.WriteLine(Char.ToUpper(c));//显示A double d; //'\u0033'是数字3 d = Char.GetNumericValue('\u0033'); Console.WriteLine(d.ToString());//显示3 //'\u00bc'是普通数据四分之一 d=Char.GetNumericValue('\u00bc'); Console.WriteLine(d.ToString());//显示0.25 //'A' 是大写拉丁字母A d = Char.GetNumericValue('A'); Console.WriteLine(d.ToString());//显示-1 Console.Read(); } } }
可以使用三种技术实现各种数值类型与Char实例之间的相互转换。下面按照优先顺序列出这些技术
需要一个char转换成一个数值(比如int32)最简单的办法就是转型。在三种技术中这种转型效率最高,不必调用任何方法,编译器会自动生成中间指令来执行转换。此外,C#中还可使用checked和unchecked代码。
System.Convert类提供了几个静态方法来实现char和数值类型之间的相互转换。所有这些方法都以checked方式来执行转换,所以一旦发现转换会造成数据的丢失,就会抛出OverflowExcetion异常。
char类型和FCL中所有数值类型都实现了IConvertible接口。该接口定义了像ToInt16和ToChar这样的方法。这种接口效率最差,因为值类型上调用一个接口要对一个实例进行装箱。如果某个数值类型不能转换(比如将char转换成boolean值)或者转换造成数据丢失,IConvertible的方法会抛出一个System.InvalidCastExcetion异常。注意:许多类型(包括FCL的char和数值类型)都将IConvertible方法实现为显式接口成员,也就是使用前必须将实例显式转换为一个IConvertible。
以下代码演示了如何使用这三种技术
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { char c; Int32 n; //使用C#技术实现数字与字符的相互转换 c = (char)65; Console.WriteLine(c);//显示'A' n = (int)c; Console.WriteLine(n);//显示'65' c = unchecked((char)(65536+65)); Console.WriteLine(c);//显示'A' //使用Convert实现数值与字符的相互转换 c = Convert.ToChar(65); Console.WriteLine(c);//显示'A' n= Convert.ToInt32(c); Console.WriteLine(n);//显示'65' try { c = Convert.ToChar(70000);//对16位数来说数字太大 Console.WriteLine(c);//显示不执行 } catch(OverflowException ) { Console.WriteLine("con't convert 70000 to a char"); } //使用IConvertible实现数字与字符的相互转换 c = ((IConvertible)65).ToChar(null);//该转换对象实现了IformatProvider接口,转换时需要考虑语言文化信息,但是大多数可以互略语言文化,为这个参数传递null值 Console.WriteLine(c);//显示'A' n = ((IConvertible)c).ToInt32(null);//该转换对象实现了IformatProvider接口,转换时需要考虑语言文化信息,但是大多数可以互略语言文化,为这个参数传递null值 Console.WriteLine(n);//显示'65' Console.Read(); } } }