2013年6月12日 星期三

中文字 與 區位碼的轉換

區位碼 在學生考試時期 時常看到 映像中2B鉛筆畫滿黑空格
最後方便於 電腦讀取的一種紙卡 可節省不少時間的樣子
但是對於 這種作法不表示贊成 因為身為學生 畫那東西超類XD
恩~偏題了!  關於區位碼 的使用 可以讓 程序員更理解 編碼方式
及 字元轉換原理
我們接下來 將要把 中文字 轉乘 區位碼
區位碼 是一個 十進制 的4個數字組成
前兩碼是區碼後兩把是位碼
關於 區位碼的理解 目前尚未找到 實用性佳的地方
不過對於了解 密碼學 與 電腦內部編碼記憶體 機械語言有者密不可分的關西
多了解 以備不時之需

大致解說一下 轉換原理

比如說 "健"這個字
BIG碼 是B0B7
取位元組 在轉 十進制 =176,183
再將這兩位元組 分別減160
等於16與23
在字串相加=1623 就是區位碼了


再來看程式範例 更能進入狀況了

private void btn_Get_Click(object sender, EventArgs e)
        {
            if (txt_Chinese.Text != string.Empty)//判斷輸入是否為空
            {
                try
                {
                    // 呼叫副程式getCode("帶參數")
                    txt_Num.Text = getCode(txt_Chinese.Text);
                }
                catch (IndexOutOfRangeException ex)
                {
                    MessageBox.Show(//使用消息對話框提示異常訊息
                        ex.Message + "請輸入正確的中文字", "出錯!");
                }
            }
        }
        /// <summary>
        /// 得到中文字區位碼方法
        /// </summary>
        /// <param name="strChinese">中文字字符</param>
        /// <returns>返回中文字區位碼</returns>
        public string getCode(string Chinese)//Chinese是txt_Chinese.text
        {
            //Default預設編碼為DBCS
            //DBCS是雙位元組字元集
            byte[] P_bt_array = Encoding.Default.GetBytes(Chinese);//得到中文字的2Byte陣列
            int front = (short)(P_bt_array[0] );//將字節陣列的第一位轉換成short類型
            //short帶正負號的 16 位元整數-32,768 至 32,767
            int back = (short)(P_bt_array[1] - '\0');//也將將字節陣列的第二位轉換成short類型
            //之後全部用INT 整數裝起來
            //最後在個別-160   字串在相加
            //176-160= 16  + 183-160=23 =1623 就是區位碼了
            return (front - 160).ToString() + (back - 160).ToString();//計算並返回區位碼
        }






 


PS:Default 屬性。判斷系統使用的預設字碼頁