C# - char类型的一些介绍
char
c#里面的char,其实就是system.char类型的别名,它代表一个unicode字符(是这样吗?),占用两个字节。
例如:char c = ‘a’;
char占用两个字节,也就是16位,其实本质上char其实就是16位的无符号整型数值,范围是0到65535,也就是和无符号short的范围是一样的。
转义字符
有一些字符无法通过字面的意思来进行解释,这时候就可以使用转义字符。
转义字符是以 / 开始,后边跟着一个有特殊意义的字符。
例如:
char newline = '\n'; 这个表示换行
char backslash = '\\'; 这个就表示 \
转义字符的列表如下:
还有\u(\x)这两个转义字符可以让你通过4位16进制的形式来表示任意的unicode字符,例如:
char copyrightsymbol = '\u00a9'; // ©
char omegasymbol = '\u03a9'; // ω
char newline = '\u000a'; // 换行
转换
char类型的变量可以隐式的转换到可容纳无符号short类型的数值类型,例如:
字符扩展
char只能代表一个unicode字符, 其实这句话不太准确。
我们知道unicode里 65 代表着字母 a,但其实65是a的unicode代码点,通常是这样来表示的 u+0041,16进制的41就是10进制的65。
而看这个例子,德语里面有个字符:ß,它的unicode是 u+00df,但就其本身而言,ß 不是一个字母,ß被认为等价于ss(也就是两个s),例如fußball就相当于fussball。
而用在字符/字符串比较的时候,就不可以把ß当作一个字符来处理,而是把ß=ss。
而ß所对应的u+00df这个代码点就是字符扩展(character expansion)的一个例子,如果想正确的比较字符/串,那么这个代码点就必须先转化为其它的多个代码点,这里就是 u+00df -> u+0073 + u+0073,也就是ß -> ss,记住,这只是用于比较,而不是展示。
字符代理
字符代理(char surrogates),和字符扩展正好相反。
字符扩展是指,一个字符代表了多个实际的字符;而字符代理呢,就是使用两个char的实例来表示一个实际的字符。
字符代理之所以存在,是因为它的范围太小了(0-65535),所以根本无法代表世界上这么多语言的字符。实际上unicode的代码点是从0到1114111(0x10ffff),所以16位的存储远远不够用。
正是因为这点,unicode utf16有一个可以表示所有字符的体系,就是使用两个连续的16位数值来表示,这就叫做代理对(surrogate pairs)。
在这两个连续的16位数值里,第一个数的范围是u+d800到u+dbff(55296到56319),所以如果您在解析字符/串的时候,解析出来的数值正好落在这个范围里,那么你就需要把这个char和它后边的char连在一起进行解析,才能得出真正要表示的字符。
从术语上讲,第一个16位数叫做high surrogate(高代理项),第二个数叫做low surrogate(低代理项)。
例如:
上一篇: 昨晚实在是太疯狂了
下一篇: java-过滤器(Filter)