海底泥 發表於 2019-5-16 15:37:00

C# - char类型的一些介绍

<h1>Char</h1>
<p>C#里面的char,其实就是System.Char类型的别名,它代表一个Unicode字符(是这样吗?),占用两个字节。</p>
<p>例如:char c = ‘A’;</p>
<p>char占用两个字节,也就是16位,其实本质上char其实就是16位的无符号整型数值,范围是0到65535,也就是和无符号short的范围是一样的。</p>
<p>&nbsp;</p>
<h2>转义字符</h2>
<p>有一些字符无法通过字面的意思来进行解释,这时候就可以使用转义字符。</p>
<p>转义字符是以 / 开始,后边跟着一个有特殊意义的字符。</p>
<p>例如:</p>
<p>char newLine = '\n'; 这个表示换行</p>
<p>char backSlash = '\\'; 这个就表示 \</p>
<p>&nbsp;</p>
<p>转义字符的列表如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201905/986268-20190516054751463-388072163.png" alt=""></p>
<p>&nbsp;</p>
<p>还有\u(\x)这两个转义字符可以让你通过4位16进制的形式来表示任意的Unicode字符,例如:</p>
<p><span class="fontstyle0">char copyrightSymbol = '\u00A9'; //&nbsp;©<br>char omegaSymbol = '\u03A9'; //&nbsp;Ω<br>char newLine = '\u000A'; // 换行<br><br></span></p>
<h2>转换</h2>
<p>char类型的变量可以隐式的转换到可容纳无符号short类型的数值类型,例如:</p>
<p><img src="https://img2018.cnblogs.com/blog/986268/201905/986268-20190516055344765-1180760908.png" alt=""></p>
<p>&nbsp;</p>
<h1>字符扩展</h1>
<p>char只能代表一个Unicode字符, 其实这句话不太准确。</p>
<p>我们知道Unicode里 65 代表着字母 A,但其实65是A的Unicode代码点,通常是这样来表示的 U+0041,16进制的41就是10进制的65。</p>
<p>&nbsp;</p>
<p>而看这个例子,德语里面有个字符:ß,它的UniCode是 U+00DF,但就其本身而言,ß 不是一个字母,ß被认为等价于ss(也就是两个s),例如fußball就相当于fussball。</p>
<p>而用在字符/字符串比较的时候,就不可以把ß当作一个字符来处理,而是把ß=ss。</p>
<p>而ß所对应的U+00DF这个代码点就是字符扩展(<strong>Character expansion</strong>)的一个例子,<strong>如果想正确的比较字符/串,那么这个代码点就必须先转化为其它的多个代码点</strong>,这里就是 U+00DF -&gt; U+0073 + U+0073,也就是ß -&gt; ss,记住,这只是用于比较,而不是展示。</p>
<p>&nbsp;</p>
<h1>字符代理</h1>
<p>字符代理(<strong>char surrogates</strong>),和字符扩展正好相反。</p>
<p><strong>字符扩展是指,一个字符代表了多个实际的字符</strong>;<strong>而字符代理呢,就是使用两个char的实例来表示一个实际的字符</strong>。</p>
<p>字符代理之所以存在,是因为它的范围太小了(0-65535),所以根本无法代表世界上这么多语言的字符。实际上Unicode的代码点是从0到1114111(0x10FFFF),所以16位的存储远远不够用。</p>
<p>正是因为这点,Unicode UTF16有一个可以表示所有字符的体系,就是使用两个连续的16位数值来表示,这就叫做代理对(surrogate pairs)。</p>
<p>在这两个连续的16位数值里,第一个数的范围是U+D800到U+DBFF(55296到56319),所以如果您在解析字符/串的时候,解析出来的数值正好落在这个范围里,那么你就需要把这个char和它后边的char连在一起进行解析,才能得出真正要表示的字符。</p>
<p>从术语上讲,第一个16位数叫做High Surrogate(高代理项),第二个数叫做Low Surrogate(低代理项)。</p>
<p>&nbsp;</p>
<p>例如:𝄞&nbsp;它的Unicode 代码点是&nbsp;U+1D11E,它包含一个High Surrogate:U+D834 和一个Low Surrogate:U+DD1E</p>
<p>&nbsp;</p>
<h1>合并字符</h1>
<p>此外有一些代码点还会修改前一个字符,比如说 <strong>ä </strong>这个字符,它可以用U+00E4来表示。</p>
<p>而我也可以使用 <strong>a +&nbsp; ̈&nbsp;</strong> (U+0061 + U+0308)的形式来表示该字符,在这里U+0308就表示两个点,它会修改前一个字符。</p>
<p>在Unicode的标准中,后边这个字符就叫做 Combining diaeresis(组合用分音符?)</p>
<p>而在实际中字符/串比较的时候,你需要把这两个字符合并当作U+00E4才可以。</p>
<p>&nbsp;</p>
<h1>其它</h1>
<p>char有ToUpper()和ToLower()两个方法可以变换大小写,它们首先会遵循用户的locale(区域设置),但是这就有可能引起一个bug:</p>
<p><span class="fontstyle0">char.ToUpper ('i') == 'I' <br></span></p>
<p><span class="fontstyle0">这个表达式在土耳其语里面会返回false。</span></p>
<p><span class="fontstyle0">在土耳其语里面 i 被 ToUpper()之后返回的是&nbsp;<span class="fontstyle0">İ (看起来像大写的I上面还有一个点),所以与大写的 I 不等。<br></span><span class="fontstyle0"><br></span></span></p>
<p><span class="fontstyle0"><span class="fontstyle0">而char也提供了不依赖用户区域的版本:</span></span></p>
<p>&nbsp;</p>
<ul>
<li>char.ToUpperInvariant ('i')</li>
<li><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">char.ToUpper ('i', CultureInfo.InvariantCulture)&nbsp;</span></span></span></li>




</ul>
<p><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">这两种写法都可以。</span></span></span></p>
<p>&nbsp;</p>
<p><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">另外一点需要注意的是,从整型转换到char类型后,很有可能变成一个超出了Unicode范围的字符,这样的字符就是不合理的。</span></span></span></p>
<p><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">为了验证字符是否合理,我们可以使用&nbsp;char.GetUnicodeCategory()方法,如果结果是<span class="fontstyle0">Unico</span></span></span></span><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">deCategory</span></span></span></span><em id="__mceDel"><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">.</span></span></span></span></em><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">OtherNotAssigned,那么该字符就不合理。</span></span></span></span></p>
<p><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0"><span class="fontstyle0">&nbsp;</span></span></span></span></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p><img src="https://img2022.cnblogs.com/blog/986268/202201/986268-20220121212852077-392691317.png" width="500" height="182.45" alt="杨旭技术专栏"></p><br><br>
来源:https://www.cnblogs.com/yangxu-pro/p/10873357.html
頁: [1]
查看完整版本: C# - char类型的一些介绍