2013年3月8日 星期五

Encoding方法與類別字元編碼轉換應用

要明白Encoding類別的轉換就必須先明白Unicode編碼的原理!
編碼是將 Unicode 字元集轉換成位元組序列的處理程序。
解碼正好相反,它是將已編碼的位元組序列轉換成 Unicode 字元集的處理程序。
我們都知道8bit 等於1byte
Unicode 標準會指派字碼指標 (數字) 給每個受支援指令碼中的每個字元。
Unicode Transformation Format (UTF) 是用來編碼該字碼指標的方法。
Unicode 標準 3.2 版使用下列 UTF:
UTF-8,將每個字碼指標表示成 1 到 4 個位元組的序列。

更多細節網址如下 MSDN
http://msdn.microsoft.com/zh-tw/library/system.text.encoding(v=VS.80).aspx



通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集。
UCS包含了已知語言的所有字元。除了拉丁語、希臘語、斯拉夫語、希伯來語、阿拉伯語、亞美尼亞語、喬治亞語,還包括中文、日文、韓文這樣的方塊文字,UCS還包括大量的圖形、印刷、數學、科學符號。
ISO/IEC 10646定義了一個31位的字符集。
ISO/IEC 10646-1標準第一次發表於1993年,現在的公開版本是ISO/IEC 10646-1:2000。ISO/IEC 10646-2在2001年發表。
UCS不僅給每個字元分配一個代碼,而且賦予了一個正式的名字。表示一個UCS或Unicode值的十六進制數通常在前面加上「U+」,例如「U+0041」代表字元「A」。

關於ISO 10646是字形標準 Wiki
http://zh.wikipedia.org/wiki/ISO_10646

UTF-16可看成是UCS-2的父集。在沒有輔助平面字元(surrogate code points)前,UTF-16與UCS-2所指的是同一的意思。但當引入輔助平面字元後,就稱為UTF-16了。現在若有軟體聲稱自己支援UCS-2編碼,那其實是暗指它不能支援在UTF-16中超過2bytes的字集。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼。
UCS-2 使用16bit 編碼空間
如上觀念已知Unicode=16bit 16進制A=0041 轉成10進制=65 轉2進制=100 0001

來看以下程式碼如何轉換吧!



private void button1_Click(object sender, EventArgs e)
        {
            //建立範例字串
            string unicodeString = "AAAThis string contains the unicode character Pi(\u03a0)\u263c";
            //建立 ASCII碼
            Encoding ascii = Encoding.ASCII;
            //建立Unicode 或 UTF8編碼較省空間
            Encoding unicode = Encoding.UTF8;//unicode使用16bit UTF8使用7bit 關於UTF8不多做說明了
            //利用byte 呼叫unicode字串 看看結果如何
            //利用把每個字分解成8bit以一個byte[]陣列存取10進制
            //會發現[0]=65 [1]=65 [2]=65 這代表 前面3個字串A的10進制表示法
            byte[] unicodeBytes = unicode.GetBytes(unicodeString);
            //將 Unicode或UTF8 轉 ASCII碼
            //目前使用UTF8較省記憶體
            /*
            
              注意!!   Encoding.Convert   為轉換用語法如下
              public static byte[] Convert (Encoding srcEncoding,Encoding dstEncoding,byte[] bytes)
              語法備註:1.srcEncoding = bytes 的編碼格式。
                       2.dstEncoding=目標編碼格式。
                       3.bytes要轉換的位元組。
           
            */
            byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
            //GetCharCount 方法 語法如下
            /*
               public override int GetCharCount(byte[] bytes,int index,int count)
               參數說明如下:
                        bytes型別:System.Byte[]   包含要解碼之位元組序列的位元組陣列。
                        index型別:System.Int32    要解碼的第一個位元組索引。
                        count型別:System.Int32    要解碼的位元組數。
               詳細請查略MSDN網址如下
               http://msdn.microsoft.com/zh-tw/library/x0s90hwc(v=vs.90).aspx
             */
            //以下將轉換成字元陣列
            char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
            //再利用GetChars 方法進行解碼
            //語法如下
            /*
               public abstract int GetChars (byte[] bytes,int byteIndex,int byteCount,char[] chars,int charIndex)
               參數說明如下:
                         bytes包含要解碼之位元組序列的位元組陣列。
                         byteIndex要解碼的第一個位元組索引。
                         byteCount要解碼的位元組數。
                         chars包含結果字元集的字元陣列。
                         charIndex要開始寫入結果字元集的索引。
             */
            ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
            //將 asciChars轉成字串輸出
            string asciiString = new string(asciiChars);
            MessageBox.Show(unicodeString);
            MessageBox.Show(asciiString);
            //END!!
        }

關於取自原陣列2方法GetChars()與ToCharArray()複習


private void button2_Click(object sender, EventArgs e)
        {
            string RR = "ABCD";
           
           
            Encoding uni = Encoding.ASCII;
            byte[] EE = uni.GetBytes(RR);
            //unicode得到的長度=    EE有4BYTE = [0]65[1]66[2]67[3]68
            //                      0代表取一位 1代表取第二位索引
            //                      EE.Length就是取EE的長度 [0][1][3][4] =4個 長度4
            char[] chars = new char[uni.GetCharCount(EE,0,EE.Length)];
            //將指定位元組陣列中的位元組序列解碼成指定的字元陣列。
            uni.GetChars(EE, 0, EE.Length, chars, 0);
            string GG = new String(chars);
            MessageBox.Show(GG);
        }









再來利用ToCharArray取字元陣列 算是意外的發現 似乎更簡單

private void button3_Click(object sender, EventArgs e)
        {
            string QP = "ggyy77889900";
            string YY = "";
            char[] ttst = QP.ToCharArray(); //也可以使用ToCharArray取字元陣列
            for (int i = 0; i <= ttst.Length - 1; i++)
            {
                YY += ttst[i];
            }
            MessageBox.Show(YY);
        }

沒有留言:

張貼留言