C#实现全角字符和半角字符转换 | 您所在的位置:网站首页 › 半角字符全角字符切换 › C#实现全角字符和半角字符转换 |
本文转自: 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]外的英文字符还有对应的全角字符的话) using System;using System.Text;namespace MyCollections.StringOperations /**//// /// 功能:实现英文字符间全角半角转换 /// version: 1.0 /// class SBCcaseAndDBCcase ...{ "常量"#region "常量" /**//*最大的有效全角英文字符转换成int型数据的值*/ private const int MaxSBCcaseToInt = 65374; /**//*最小的有效全角英文字符转换成int型数据的值*/ private const int MinSBCcaseToInt = 65281; /**//*最大的有效半角英文字符转换成int型数据的值*/ private const int MaxDBCcaseToInt = 126; /**//*最小的有效半角英文字符转换成int型数据的值*/ private const int MinDBCcaseToInt = 33; /**//*对应的全角和半角的差*/ private const int Margin = 65248; #endregion "全角转换为半角"#region "全角转换为半角" "全角转换为半角 public static string ConvertSBCcaseToDBCcase(string originalStr,int start,int end)"#region "全角转换为半角 public static string ConvertSBCcaseToDBCcase(string originalStr,int start,int end)" /**//// /// 时间:2007-10-30 /// 功能:全角转换为半角 /// version: 1.0 /// /// 要进行全角到半角转换的字符串 /// 要进行全角到半角转换的开始位置,不能大于end /// 要进行全角到半角转换的结束位置,不能小于start /// 转换成对应半角的字符串 public static string ConvertSBCcaseToDBCcase(string originalStr,int start,int end) ...{#region "异常判断" if (start end) ...{ throw new Exception("开始位置不能大于结束位置"); } if (start >= originalStr.Length || end >= originalStr.Length) ...{ throw new Exception("开始位置或结束位置必须小于字符串的最大长度"); } "异常判断"#region "异常判断" if (start end) ...{ throw new Exception("开始位置不能大于结束位置"); } if (start >= originalStr.Length || end >= originalStr.Length) ...{ throw new Exception("开始位置或结束位置必须小于字符串的最大长度"); } #endregion /**//*空字符串返回空*/ if (originalStr == "") ...{ return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i = start && i = MinSBCcaseToInt && (int)originalChar end) ...{ throw new Exception("开始位置不能大于结束位置"); } if (start >= originalStr.Length || end >= originalStr.Length) ...{ throw new Exception("开始位置或结束位置必须小于字符串的最大长度"); } #endregion /**//*空字符串返回空*/ if (originalStr == "") ...{ return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i = start && i = MinDBCcaseToInt && (int)originalChar end) ...{ throw new Exception("开始位置不能大于结束位置"); } if (start >= originalStr.Length || end >= originalStr.Length) ...{ throw new Exception("开始位置或结束位置必须小于字符串的最大长度"); } #endregion /**//*空字符串返回空*/ if (originalStr == "") ...{ return ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i = start && i = MinSBCcaseToInt && (int)originalChar = MinDBCcaseToInt && (int)originalChar |
CopyRight 2018-2019 实验室设备网 版权所有 |