C# 全角半角的問題

本人在做項目時遇到這樣的情況:讀取Excel中別人輸入的內容呢。但是有一個問題是,必須別人輸入的是英文的逗號才行,我可以控制自己,但是控制別人有點不現實。所以想的是,別人輸入什麼樣的逗號,我這邊都能解釋。


基礎

全角:SBC case(sexagesimal to Binary Converter)六十進制轉二進制
半角:DBC case(Decimal to Binary Converter)十進制轉二進制
之所以叫全角半角:在屏幕上,一個漢字佔兩個標準字符的位置,因此把只佔一個標準字符位置的英文字符所佔位置叫“半角”,一般主要針對標準符號來說的。

半角是ASCII碼中的各個符號。在ASCII碼中,32-126爲可現實字符,1-31,127爲控制字符,不予考慮。
全角是GB22312-80(信息交換用漢字編碼字符集·基本集)中的各個符號。對應的字符爲65281-65374。
但是全角空格爲12288,半角空格爲32。全角半角相差65248,所以除了空格外,全角字符-65248 = 半角字符。

但是特別的是,不管是全角還是半角輸入法打出來的漢字所佔的都是兩位,也就是全角,圓圈句號也是。但是點句號不是,點句號會改變大小,跟逗號一樣,逗號能看出來改變形狀,但其實也就是改變大小。而數字和字母會看到明顯的所佔位不同。到目前爲止,我測試的只有圓圈句號和中文字不會改變佔位。其他的都會變。


代碼

一般來講,字符串可以用char[],也可以用StringBuilder動態數組。

/// 半角轉全角
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static String ToSBC(String input)
        {
            char[] c = input.ToCharArray();
            for (int i = 0; i < c.Length; i++)
            {
                if (c[i] == 32)                      //十進制中32爲空格
                {
                    c[i] = (char)12288;
                    continue;
                }
                if (c[i] < 127)      
                { c[i] = (char)(c[i] + 65248); }
            }
            return new String(c);
        }
///全角轉半角
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static String ToDBC(String input)
        {
            char[] c = input.ToCharArray();
            for (int i = 0; i < c.Length; i++)
            {
                if (c[i] == 12288)
                {
                    c[i] = (char)32;
                    continue;
                }
                if (c[i] > 65280 && c[i] < 65375)//GB22312-80集中這一段對應ASCII碼。
                { c[i]=(char)(c[i]-65248);}
            }
            return new String (c);
        }

在main函數中這樣寫

 string strSBC = ",。。中華1259test";
 string result = ToDBC(strSBC);
 Console.WriteLine("原來是"+strSBC+"\n"+"現在是"+result);
 string strDBC = ",,..中華1259test";
 string resultDBC = ToSBC(strDBC);
 Console.WriteLine("原來是" + strDBC + "\n" + "現在是" + resultDBC);
 Console.ReadKey();

就是這麼簡單,學習了兩者之間的轉換,學習了兩種碼是個什麼東西。
注意String和string的區別,怎麼設置動態字符串數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章