字符、字符串和文本的处理之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 = ,
//
// 摘要:
// 小写字母。 由 Unicode 代码“Ll”(字母,小写)表示。 值为 1。
LowercaseLetter = ,
//
// 摘要:
// 词首字母大写的字母。 由 Unicode 代码“Lt”(字母,词首字母大写)表示。 值为 2。
TitlecaseLetter = ,
//
// 摘要:
// 修饰符字母字符,它是独立式的间距字符,指示前面字母的修改。 由 Unicode 代码“Lm”(字母,修饰符)表示。 值为 3。
ModifierLetter = ,
//
// 摘要:
// 不属于大写字母、小写字母、词首字母大写或修饰符字母的字母。 由 Unicode 代码“Lo”(字母,其他)表示。 值为 4。
OtherLetter = ,
//
// 摘要:
// 指示基字符的修改的不占位字符。 由 Unicode 代码“Mn”(符号,不占位)表示。 值为 5。
NonSpacingMark = ,
//
// 摘要:
// 间隔字符,它指示基字符的修改并影响基字符的标志符号的宽度。 由 Unicode 代码“Mc”(符号,间隔组合)表示。 值为 6。
SpacingCombiningMark = ,
//
// 摘要:
// 封闭符号字符,它是将基字符前面的所有字符(包括基字符)括起来的不占位字符。 由 Unicode 代码“Me”(符号,封闭)表示。 值为 7。
EnclosingMark = ,
//
// 摘要:
// 十进制数字字符,即范围 0 到 9 内的字符。 由 Unicode 代码“Nd”(数字,十进制数字)表示。 值为 8。
DecimalDigitNumber = ,
//
// 摘要:
// 由字母表示的数字,而不是十进制数字,例如,罗马数字 5 由字母“V”表示。 此指示符由 Unicode 代码“Nl”(数字,字母)表示。 值为 9。
LetterNumber = ,
//
// 摘要:
// 既不是十进制数字也不是字母数字的数字,例如分数 1/2。 此指示符由 Unicode 代码“No”(数字,其他)表示。 值为 10。
OtherNumber = ,
//
// 摘要:
// 没有标志符号但不属于控制或格式字符的空格字符。 由 Unicode 代码“Zs”(分隔符,空格)表示。 值为 11。
SpaceSeparator = ,
//
// 摘要:
// 用于分隔文本各行的字符。 由 Unicode 代码“Zl”(分隔符,行)表示。 值为 12。
LineSeparator = ,
//
// 摘要:
// 用于分隔段落的字符。 由 Unicode 代码“Zp”(分隔符,段落)表示。 值为 13。
ParagraphSeparator = ,
//
// 摘要:
// 控制代码字符,其 Unicode 值为 U+007F,或者属于 U+0000 到 U+001F 或 U+0080 到 U+009F 的范围内。 由 Unicode
// 代码“Cc”(其他,控制)表示。 值为 14。
Control = ,
//
// 摘要:
// 格式字符,它影响文本的布局或文本处理操作,但通常不呈现。 由 Unicode 代码“Cf”(其他,格式)表示。 值为 15。
Format = ,
//
// 摘要:
// 高代理项或低代理项字符。 代理项代码值在 U+D800 到 U+DFFF 的范围内。 由 Unicode 代码“Cs”(其他,代理项)表示。 值为 16。
Surrogate = ,
//
// 摘要:
// 专用字符,其 Unicode 值在在 U+E000 到 U+F8FF 的范围内。 由 Unicode 代码“Co”(其他,专用)表示。 值是 17。
PrivateUse = ,
//
// 摘要:
// 连接两个字符的连接符标点字符。 由 Unicode 代码“Pc”(标点,连接符)表示。 值为 18。
ConnectorPunctuation = ,
//
// 摘要:
// 短划线或连字符字符。 由 Unicode 代码“Pd”(标点,短划线)表示。 值为 19。
DashPunctuation = ,
//
// 摘要:
// 成对的标点符号(例如括号、方括号和大括号)的开始字符。 由 Unicode 代码“Ps”(标点,开始)表示。 值为 20。
OpenPunctuation = ,
//
// 摘要:
// 成对的标点符号(例如括号、方括号和大括号)的结束字符。 由 Unicode 代码“Pe”(标点,结束)表示。 值为 21。
ClosePunctuation = ,
//
// 摘要:
// 左引号或前引号字符。 由 Unicode 代码“Pi”(标点,前引号)表示。 值为 22。
InitialQuotePunctuation = ,
//
// 摘要:
// 右引号或后引号字符。 由 Unicode 代码“Pf”(标点,后引号)表示。 值为 23。
FinalQuotePunctuation = ,
//
// 摘要:
// 不属于连接符、短划线、开始标点、结束标点、前引号或后引号的标点字符。 由 Unicode 代码“Po”(标点,其他)表示。 值为 24。
OtherPunctuation = ,
//
// 摘要:
// 数学符号字符,如“+”或“=”。 由 Unicode 代码“Sm”(符号,数学)表示。 值为 25。
MathSymbol = ,
//
// 摘要:
// 货币符号字符。 由 Unicode 代码“Sc”(符号,货币)表示。 值为 26。
CurrencySymbol = ,
//
// 摘要:
// 修饰符符号字符,它指示环绕字符的修改。 例如,分数斜线号指示其左侧的数字为分子,右侧的数字为分母。 此指示符由 Unicode 代码“Sk”(符号,修饰符)表示。
// 值为 27。
ModifierSymbol = ,
//
// 摘要:
// 不属于数学符号、货币符号或修饰符符号的符号字符。 由 Unicode 代码“So”(符号,其他)表示。 值为 28。
OtherSymbol = ,
//
// 摘要:
// 未分配给任何 Unicode 类别的字符。 由 Unicode 代码“Cn”(其他,未分配)表示。 值为 29。
OtherNotAssigned =
}
该方法有两种传参方式,如下:
//
// 摘要:
// 将指定字符串中位于指定位置的字符分类到由一个 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(''));
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);
Console.WriteLine(c); var n = (int)c;
Console.WriteLine(n); c = unchecked((char)(+));
Console.WriteLine(c); n = Convert.ToInt32(c);
Console.WriteLine(n); //Convert的范围检查
try
{
c = Convert.ToChar();//对于16位来说过大
Console.WriteLine(c); //不执行,上面的异常被catch
}
catch (OverflowException)
{
Console.WriteLine("Can't convert 70000 to a Char.");
} c = ((IConvertible)).ToChar(null); //可以传递一个IFormatProvider参数,但是大多数情况下不需要,应为大多数情况下可以忽略语言文化
Console.WriteLine(c); n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); Console.ReadKey();
字符、字符串和文本的处理之Char类型的更多相关文章
- [Clr via C#读书笔记]Cp14字符字符串和文本处理
Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...
- <NET CLR via c# 第4版>笔记 第14章 字符,字符串和文本处理
14.1 字符 三种数值类型与 Char 实例的相互转换: static void Main() { Char c; Int32 n; //方法一: 通过C#转型(强制类型转换)实现数字与字符的相互转 ...
- 字符、字符串和文本的处理之String类型
.Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...
- clr from c# 字符 ,字符串 和 文本处理
1,字符----------在.net中,字符总是16位的Unicode代码值.每个字符都是一个System.Char结构(值类型)的一个实列. using System; public class ...
- [CLR via C#]14. 字符、字符串和文本处理
一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.System ...
- 重温CLR(十) 字符、字符串和文本处理
本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...
- 【C#进阶系列】14 字符、字符串和文本编码
本来写了蛮多的,结果因为重启了一下机器导致写的东西都没了. 然后再回想之前写了什么,反而更像是把知识提炼了一番. 关于字符 字符什么的只要记住.net里面都用的Unicode编码就好.字符和数字之间转 ...
- 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制
过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...
- CLR via C#字符串和文本处理
一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.Sy ...
随机推荐
- windows访问ubuntu的文件
前提:windows电脑和ubuntu电脑要工作在同一个网段! 1.先要安装Samba sudo apt-get install samba openssh-server 2.编译Samba配置文件 ...
- DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)
ODT ( On-DieTermination ,片内终结)ODT 也是 DDR2 相对于 DDR1 的关键技术突破,所谓的终结(端接),就是让信号被电路的终端吸 收掉,而不会在电路上形成反射, 造成 ...
- python advanced programming (Ⅲ)
IO编程 IO在计算机中指Input/Output.由于程序和运行时数据是在内存中驻留,由CPU来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. IO编程中,Stream(流)是一个 ...
- python使用数据库的一些操作
学py感觉还是用linux操作系统比较好,下载安装mysql很简单,linux里面都有自带的,但是要用python去用mysql我们就得安装一下他的模块,因为python里面没有自带他的模块,用yum ...
- Beta阶段第六篇Scrum冲刺博客-Day5
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:完善收藏功能 郭琪容:收藏功能的实现 吴玲:完 ...
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- 第71讲:Scala界面Panel、Layout实战详解
今天学习了王家林老师scala讲座的第71讲,scala界面编程panel实战.让我们一起来看一下. 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark 关注微信账号,获取更多关于王家林老师的 ...
- 1、从C语言到C++
1.面向对象的C++ c++是在C语言的基础上发展起来的一门语言,C++是即支持结构化程序编程又支持面向对象程序设计的混合型语言.他一方面提供了对C的兼容性,保持了C的简介.高效,接近汇编语言的特点, ...
- codeforce868c
C. Qualification Rounds time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- AngularJS 事件广播与接收 $broadcast,$emit,$on 作用域间通信 封装factory服务 发布订阅
不同作用域之间通过组合使用$broadcast,$emit,$on的事件广播机制来进行通信. 一.说明 1.广播 $broadcast 说明:将事件从父级作用域传播至本作用域及子级作用域. 格式:$b ...