本文转自: http://blog.csdn.net/wangchao1982/article/details/1857444,写的很好,直接转了,谢谢!
很多的朋友都在学习和工作中遇到过全角和半角的问题.大多数人都绕过去了.原因无非是两点:第一点是不能简洁的处理这个问题,第二点是无法解决页面刷新.当然在微软的ajax补丁发布后第二点基本上不算问题了(当然也有别的优秀的AJAX机构能够完美的解决页面刷新的问题AjaxPro.2.dll这个小东东就VERY GOOD).但是过分的依赖微软的ajax会对性能产生影响的.在后面的文章中我会谈一谈自己的看法.
在文章的最后面我会贴出一个比较完善的全角半角转换类.
大家很清楚要解决全角半角转换的问题,肯定不能穷举那二百来个全角英文字符和半角英文字符.所以我们必须找出他们之间的联系.我们知道所有的字符都会对应一个整形值.那么我们可以做一个减法运算来证明一下全角和半角间是否存在这一个对应关系:两者的差是一个常量还是一个有规律的差值.下面的一小段代码就可以证明我们的猜测(假如他们之间的差值是一个固定值)
1 for (int i = 0; i < 256; i++) 2 { 3 Console.WriteLine(i.ToString() + " " + (char)i + " " + (char)(i + 'a' - 'a')); 4 }
这段代码证明了我的猜测基本上是正确的.(注意:最后面显示是问号的则说明没有对应的全角字符,或者是全角和半角的差值不是这个常量)为什么说是基本上是正确的呢?因为整型值32是空格,空格是有全角半角之分的(也就是这个家伙把大家弄的很痛苦),但是把半角空格加上这个常量后显示的是问号.看来空格是特殊的.我们用(int)(‘ ‘ – ‘ ‘)[注,前面是全角空格,后面是半角空格]输出一下发现:全角和半角空格的差值是12256,而其他的是65248.既然这样,那么代码就好写了.我的代码只处理[32,126]之间的字符(是闭区间哦).因为我对字符编码这块比较外行,此外就是这个区间的字符能够满足绝大多数的情况(希望对字符编码有研究的前辈们能够完善我这个简陋的程序,让它变得更加完善-----如果在[32-126]外的英文字符还有对应的全角字符的话)
</returns>
public static string ExchangeSBCcaseAndDBCcase(string originalStr, int start, int end)
![]()