編碼是將 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);
}
沒有留言:
張貼留言