2013年5月31日 星期五

字母與ASCII的轉換

前文參考

在本文將介紹 如何將A的字元 轉成 ASCII

大概複習一下!
ASCII(美國信息互換標準代碼)是一套電腦編碼系統

UNICODE 是萬國碼,使電腦得以呈現世界上數十種文字的系統

再來須注意的是ASCII碼有多種編碼方式 UTF8 表示8bit與
UTF16表示16bit
在 C# 中,所有記憶體內的字串編碼都是 Unicode (UTF-16)

OK觀念清楚後 來開始看如何轉換吧!

首先來個字串A好了
string F="A";
我們的目標是要把A的ASCII碼SHOW出
再來宣告物件 變數Q是Encodeng物件
GetEnocding設定取的Unicode UTF16
Encoding Q= encoding.GetEncoding("Unicode")

用byte[]存取8位元為一個陣列 Q.GeyByte(取F的Unicode-UTF16)
byte[] x=Q.GeyBytes(F);

這邊順便解釋一下 陣列中的數值
注意 我門的容器是Byte[]代表 8bit一個陣列
但是 GetByte是一個UTF16的 16bit
這代表著甚麼事情呢
代表著 byte[]陣列中
A=65 轉二進為 10000010 00000000 前8bit都用不完了
那後面的8bit           00000000 =10進致的0
GetByte取的是16bit
所以 byte[]陣列中
後面8bit 將等於0
X[0]= 65    X[1]=0

再來只需要把 陣列 show出 即可

來看一下程式碼如下

private void button1_Click(object sender, EventArgs e)
        {
            string r = "z";
            //在 C# 中,所有記憶體內的字串編碼都是 Unicode(UTF-16)16bit。
            //當您將資料從儲存區帶入 string 物件時,資料會自動轉換成 UTF-16
            Encoding Q = Encoding.GetEncoding("UTF-16");//設定取UTF16
            byte[] p = Q.GetBytes(r);//Q取r字串中的UTF16以每8bit放進byte[]陣列
            string f = p[0].ToString();//p[0]=122再轉成字串輸出
           
        }

再來我們看
更進階的寫法 在書看到的
類是匿名方式 剛接觸有點混亂 所以紀錄一下
來看一下 Encoding 的合併宣告+判斷

首先來個題目
String A="zA" //等等要解析z與A
//先來個位元組容器 並在W後面直接建立物件
byte[] W = Encoding.GetEncoding("Unicode").GetBytes(A);
//再來做輸出動作 並指定陣列W[0] 代表z
MessageBox.Show(W[0].ToString());

再來另一個做法
以字串當容器 缺點是會長一點
不同的是 要在GetBytes中建立char 並指定A字串中哪一個字[0]=z [1]=A
之後再以位元組的角度去思考[0] 輸入字串
注意 前者陣列是字串 後者 指位元組
string RRT = Encoding.GetEncoding("unicode").GetBytes(new char[] {A[1]})[0].ToString();
之後直接輸出 即可

再來我們看看如何將Unicode轉回字元吧
我們都知道A=65

//先用整數型態存取65
int E=65;
//再來需要char的幫忙 char
//存放不帶正負號的 16 位元 (2 位元組) 字碼指標,範圍從 0 到 65535。
//每一個「字碼指標」或字元碼代表單一 Unicode 字元。
char G=(char)A;
G裡面會存放一個65
如果要存放2個以上呢
只好用陣列了!
char[] yt = { 'H', 'I' };
yt[0]=72  yt[1]=73
現在明白char是存取數值
再來往下探討

int E=65; //設定整數E=65
string y=((char)E).ToString();
MessageBox.Show(y);
用一個字串String 當容器
((char)E)將E轉成char
再將char值轉對等的字串表示
剛好放進string容器中
在show出來65即可轉回 A


明白這原理後 可以來看正是題目了
例題如下

2個BUTTON! 4個textbox
每一組 1個BUTTON 2個Textbox 來做字元與ASCII的轉換
第一組 字元轉ASCII
第二組 ASCII轉字元

第一組程式碼如下


private void btn_ToASCII_Click(object sender, EventArgs e)
        {                                     //你的radioButton
            if (txt_char.Text != string.Empty)//如果txt_char不等於空直
            {                                  //注意判斷式中[1]表示位元組指的是 第二位元組
                                               //數字不超過8bit! 所以剩下8bit=0通常是字母
                if (Encoding.GetEncoding("unicode").GetBytes(new char[] { txt_char.Text[0] })[1] == 0)
                {    //得到字符的ASCII碼值 直接輸出textbox!
                    txt_ASCII.Text = Encoding.GetEncoding("unicode").GetBytes(txt_char.Text)[0].ToString();
                }
                else
                {
                    txt_ASCII.Text = string.Empty;//輸入不是字母
                    MessageBox.Show("請輸入字母!", "提示!");//提示用戶訊息
                }
            }
        }





第二組如下

private void btn_ToChar_Click(object sender, EventArgs e)
        {
            if (txt_ASCII2.Text != string.Empty)//如果不等於空直 空的
            {
                int P_int_Num;//定義整型局部變數
                //將使用者在textbox輸入的數字轉成 P_int_Num
                if (int.TryParse(txt_ASCII2.Text, out P_int_Num))
                {
                    //將P_int_Num int 轉char.Tostring()=A
                    //在輸出Text屬性
                    txt_Char2.Text =((char)P_int_Num).ToString();//將ASCII碼轉換為字符
                }
                else
                {    //告訴使用者輸入已超過int整數數值範圍
                    MessageBox.Show(//如果輸入不符合要求彈出提示框
                        "請輸入正確ASCII碼值。", "錯誤!");
                }
            }
           
        }

沒有留言:

張貼留言