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'));
4 }

这段代码证明了我的猜测基本上是正确的.(注意:最后面显示是问号的则说明没有对应的全角字符,或者是全角和半角的差值不是这个常量)为什么说是基本上是正确的呢?因为整型值32是空格,空格是有全角半角之分的(也就是这个家伙把大家弄的很痛苦),但是把半角空格加上这个常量后显示的是问号.看来空格是特殊的.我们用(int)(‘ ‘ – ‘ ‘)[注,前面是全角空格,后面是半角空格]输出一下发现:全角和半角空格的差值是12256,而其他的是65248.既然这样,那么代码就好写了.我的代码只处理[32,126]之间的字符(是闭区间哦).因为我对字符编码这块比较外行,此外就是这个区间的字符能够满足绝大多数的情况(希望对字符编码有研究的前辈们能够完善我这个简陋的程序,让它变得更加完善-----如果在[32-126]外的英文字符还有对应的全角字符的话)  

using System;
using System.Text;

namespace MyCollections.StringOperations
 /// <summary>
    
/// 功能:实现英文字符间全角半角转换
    
/// version: 1.0
    
/// </summary>

    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 "全角转换为半角"

        
#region "全角转换为半角 public static string ConvertSBCcaseToDBCcase(string originalStr,int start,int end)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:全角转换为半角
        
/// version: 1.0
        
/// </summary>
        
/// <param name="originalStr">要进行全角到半角转换的字符串</param>
        
/// <param name="start">要进行全角到半角转换的开始位置,不能大于end</param>
        
/// <param name="end">要进行全角到半角转换的结束位置,不能小于start</param>
        
/// <returns>转换成对应半角的字符串</returns>

        public static string ConvertSBCcaseToDBCcase(string originalStr,int start,int end)
        
{
#region "异常判断"

            
if (start < 0 || end < 0)
            
{
                
throw new Exception("开始位置或结束位置不能小于零");
            }


            
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 < originalStr.Length; i++)
            
{
                
if (i >= start && i <= end)
                
{
                    sb.Append(ConvertSBCcaseToDBCcase(originalStr[i]));
                }

                
else
                
{
                    sb.Append(originalStr[i]);
                }

            }

            
return sb.ToString();
        }


        
#endregion


        
#region "全角转换为半角 public static string ConvertSBCcaseToDBCcase(string originalStr)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:全角转换为半角
        
/// version: 1.0
        
/// </summary>
        
/// <param name="originalStr">要进行全角到半角转换的字符串</param>
        
/// <returns>转换成对应半角的字符串</returns>

public static string ConvertSBCcaseToDBCcase(string originalStr)
        
{
            
return ConvertSBCcaseToDBCcase(originalStr, 0, originalStr.Length - 1);
        }


        
#endregion

        
#region "全角转换为半角 public static char ConvertSBCcaseToDBCcase(char originalChar)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:将全角字符转换为半角字符
        
/// version:1.0
        
/// </summary>
        
/// <param name="originalChar">要进行全角到半角转换的字符</param>
        
/// <returns>全角字符转换为半角后的字符</returns>

        public static char ConvertSBCcaseToDBCcase(char originalChar)
        
{
            
/*空格是特殊的,其全角和半角的差值也与其他字符不同*/
            
if ((int)originalChar == (int)' ')
            
{
                
return ' ';
            }

            
else
            
{
                
if ((int)originalChar >= MinSBCcaseToInt && (int)originalChar <= MaxSBCcaseToInt)
                
{
                    
return (char)(originalChar - Margin);
                }

                
else
                
{
                    
return originalChar;
                }

            }

        }


        
#endregion


        
#endregion

        
#region "半角转换为全角"

        
#region "半角转换为全角 public static string ConvertDBCcaseToSBCcase(string originalStr, int start, int end)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:半角转换为全角
        
/// version: 1.0
        
/// </summary>
        
/// <param name="originalStr">要进行半角到全角转换的字符串</param>
        
/// <param name="start">要进行半角到全角转换的开始位置,不能大于end</param>
        
/// <param name="end">要进行半角到全角转换的结束位置,不能小于start</param>
        
/// <returns>转换成对应全角的字符串</returns>

public static string ConvertDBCcaseToSBCcase(string originalStr, int start, int end)
        
{
            
#region "异常判断"

            
if (start < 0 || end < 0)
            
{
                
throw new Exception("开始位置或结束位置不能小于零");
            }


            
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 < originalStr.Length; i++)
            
{
                
if (i >= start && i <= end)
                
{
                    sb.Append(ConvertDBCcaseToSBCcase(originalStr[i]));
                }

                
else
                
{
                    sb.Append(originalStr[i]);
                }

            }

            
return sb.ToString();
        }


        
#endregion

        
#region "半角转换为全角 public static string ConvertDBCcaseToSBCcase(string originalStr)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:半角转换为全角
        
/// version: 1.0
        
/// </summary>
        
/// <param name="originalStr">要进行半角到全角转换的字符串</param>
        
/// <returns>转换成对应全角的字符串</returns>

        public static string ConvertDBCcaseToSBCcase(string originalStr)
        
{
            
return ConvertDBCcaseToSBCcase(originalStr, 0, originalStr.Length - 1);
        }


        
#endregion


        
#region "半角转换为全角 public static char ConvertDBCcaseToSBCcase(char originalChar)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:半角转换为全角
        
/// version:1.0
        
/// </summary>
        
/// <param name="originalChar">要进行半角到全角转换的字符</param>
        
/// <returns>半角字符转换为全角后的字符</returns>

        public static char ConvertDBCcaseToSBCcase(char originalChar)
        
{
            
/*空格是特殊的,其全角和半角的差值也与其他字符不同*/
            
if ((int)originalChar == (int)' ')
            
{
                
return ' ';
            }

            
else
            
{
                
if ((int)originalChar >= MinDBCcaseToInt && (int)originalChar <= MaxDBCcaseToInt)
                
{
                    
return (char)(originalChar + Margin);
                }

                
else
                
{
                    
return originalChar;
                }

            }

        }


        
#endregion


        
#endregion

 #region "全角半角互换"

        
#region "全角半角互换 public static string ExchangeSBCcaseAndDBCcase(string originalStr, int start, int end)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:将字符串中的全角字符转换为半角,半角字符转换为全角
        
/// version:1.0
        
/// </summary>
        
/// <param name="originalStr">要进行全角半角互换的字符串</param>
        
/// <param name="start">要进行全角半角互换字符串的开始位置,不能大于end</param>
        
/// <param name="end">要进行全角半角互换字符串的结束位置,不能小于start</param>
        
/// <returns>全角半角互换后的字符串</returns>
public static string ExchangeSBCcaseAndDBCcase(string originalStr, int start, int end)
        
{

            
#region "异常判断"

            
if (start < 0 || end < 0)
            
{
                
throw new Exception("开始位置或结束位置不能小于零");
            }


            
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 < originalStr.Length; i++)
            
{
                
if (i >= start && i <= end)
                
{
                    sb.Append(ExchangeSBCcaseAndDBCcase(originalStr[i]));
                }

                
else
                
{
                    sb.Append(originalStr[i]);
                }

            }

            
return sb.ToString();
        }


        
#endregion

 #region "全角半角互换 public static string ExchangeSBCcaseAndDBCcase(string originalStr)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:将字符串中的全角字符转换为半角,半角字符转换为全角
        
/// version:1.0
        
/// </summary>
        
/// <returns>全角半角互换后的字符串</returns>

        public static string ExchangeSBCcaseAndDBCcase(string originalStr)
        
{
            
return ExchangeSBCcaseAndDBCcase(originalStr, 0, originalStr.Length - 1);
        }


        
#endregion

#region "全角半角互换  public static char ExchangeSBCcaseAndDBCcase(char originalChar)"

        
/// <summary>
        
/// 时间:2007-10-30
        
/// 功能:全角字符和半角字符互换
        
/// version:1.0
        
/// </summary>
        
/// <param name="originalChar">要进行全角和半角互换的字符</param>
        
/// <returns>行全角和半角互换后的字符</returns>

        public static char ExchangeSBCcaseAndDBCcase(char originalChar)
        
{
            
if (originalChar == ' ')
            
{
                
return ' ';
            }

            
else
            
{
                
if (originalChar == ' ')
                
{
                    
return ' ';
                }

                
else
                
{
                    
if ((int)originalChar >= MinSBCcaseToInt && (int)originalChar <= MaxSBCcaseToInt)
                    
{
                        
return (char)(originalChar - Margin);
                    }

                    
else
                    
{
                        
if ((int)originalChar >= MinDBCcaseToInt && (int)originalChar <= MaxDBCcaseToInt)
                        
{
                            
return (char)(originalChar + Margin);
                        }

                        
else
                        
{
                            
return originalChar;
                        }

                    }

                }

            }

        }


        
#endregion


        
#endregion

    }

}

 
原文地址:https://www.cnblogs.com/daidaigua/p/2457712.html