C# - char类型的一些介绍

Char

C#里面的char,其实就是System.Char类型的别名,它表明一个Unicode字符(是这样吗?),占用两个字节。spa

例如:char c = ‘A’;3d

char占用两个字节,也就是16位,其实本质上char其实就是16位的无符号整型数值,范围是0到65535,也就是和无符号short的范围是同样的。代理

 

转义字符

有一些字符没法经过字面的意思来进行解释,这时候就可使用转义字符。code

转义字符是以 / 开始,后边跟着一个有特殊意义的字符。blog

例如:字符串

char newLine = '\n'; 这个表示换行io

char backSlash = '\\'; 这个就表示 \class

 

转义字符的列表以下:变量

 

还有\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(低代理项)。

 

例如:𝄞 它的Unicode 代码点是 U+1D11E,它包含一个High Surrogate:U+D834 和一个Low Surrogate:U+DD1E

 

合并字符

此外有一些代码点还会修改前一个字符,好比说 ä 这个字符,它能够用U+00E4来表示。

而我也可使用 a +  ̈  (U+0061 + U+0308)的形式来表示该字符,在这里U+0308就表示两个点,它会修改前一个字符。

在Unicode的标准中,后边这个字符就叫作 Combining diaeresis(组合用分音符?)

而在实际中字符/串比较的时候,你须要把这两个字符合并看成U+00E4才能够。

 

其它

char有ToUpper()和ToLower()两个方法能够变换大小写,它们首先会遵循用户的locale(区域设置),可是这就有可能引发一个bug:

char.ToUpper ('i') == 'I'

这个表达式在土耳其语里面会返回false。

在土耳其语里面 i 被 ToUpper()以后返回的是 İ (看起来像大写的I上面还有一个点),因此与大写的 I 不等。

而char也提供了不依赖用户区域的版本:

 

  • char.ToUpperInvariant ('i')
  • char.ToUpper ('i', CultureInfo.InvariantCulture) 

这两种写法均可以。

 

另一点须要注意的是,从整型转换到char类型后,颇有可能变成一个超出了Unicode范围的字符,这样的字符就是不合理的。

为了验证字符是否合理,咱们可使用 char.GetUnicodeCategory()方法,若是结果是UnicodeCategory.OtherNotAssigned,那么该字符就不合理。

相关文章
相关标签/搜索