关于字符编码的理解(1)
http://www.cnblogs.com/ufo0303/archive/2008/05/30/480541.html
上面BLOG我看了两天才稍微拨开了点关于编码秘团,非常感谢作者,这里就这对此理解和大家分亨一下,也加上了我的理解。
先看一下这段代码:
//UNICODE编码 (在.net里字符串是Unicode型的) string str = "中文123"; Console.WriteLine(str.Length);//长度为5 //字符串与字节串之间相互转换 //(得到GB2312编码类) Encoding gb = Encoding.GetEncoding("gb2312"); //(按照GB2312的方式对Unicode字符串进行编码并把数据放在字节数组中) byte[] bytes = gb.GetBytes(str);//从字节按照GB2312得到字符数量 //字节流中存是GB2312编码,这里转换成Unicode编码并存放在char数组中 char[] chars = gb.GetChars(bytes);//从字节按照GB2312得到UNICODE字符串
//bytes里放是按字节存放的GB2312,这里把它转换成Unicode了 str = gb.GetString(bytes);
//要将string按照某种编码写入文本文件,有两种方法 //第一种:用Stream类写入已经按照指定编码转化好的字节串 StreamWriter sw = new StreamWriter("1.txt");//9字节: sw.Write(chars); sw.Close();
//第二种方法:构造指定编码的Writer来写入字符串 //这里有一个转换,把Unicode转换成GB2312了,编码后写入文件 StreamWriter sw2 = new StreamWriter("2.txt", false, gb); //7字节 sw2.Write(str); sw2.Close();
//总结一下: //Encoding.GetEncoding("UTF-8").GetBytes() //对传进去参数按照某种编码规则进行编码 //Encoding.GetEncoding("UTF-8").GetString() //对传进去的参数进行解码,我理解也就是转换成Unicode //Encoding.GetEncoding("UTF-8").GetChars() //与第二个功能相同,只不过是反回值的类型不同
再看一个转换例子
//编码之间的转换
string unicodeStr = "this is a room";
//创建不同编码
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
//从一种编码转换成另外一种编码
byte[] unicodeBytes = unicode.GetBytes(unicodeStr);
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes); //下面显示一下转换后byte数组里的值 for (int i = 0; i < unicodeBytes.Length; i++) {
Console.WriteLine(unicodeBytes[i].ToString()); } Console.WriteLine("-----------------------------"); for (int i = 0; i < asciiBytes.Length; i++) {
Console.WriteLine(asciiBytes[i].ToString()); }
//转换成字符串 //定义一个数组, //getCharCount会返回解码后的字符的字数(解码也就是转换成Unicode),这个个数和未解码 //前的不同,就如下面显示的那样 char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
//将ASCII字序列解码成Unicode字符 ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0); //将Unicode字符构造一个Unicode的字符串 string asciiStr = new string(asciiChars);
Console.WriteLine("Original:{0}", unicodeStr); Console.WriteLine("ASCII Coverted string:{0}", asciiStr);
转换前数组里编码值
116 0 104 0 105 0 115 0 32 0 105 0 115 0 32 0 97 0 32 0 114 0 111 0 111 0 109 0
转换后的编码值 ---- 116 104 105 115 32 105 115 32 97 32 114 111 111 109
//总结:
这个转换的例子主要体现两个byte数组的不同里。我觉得第二个例子的粉色字体的部分,可以用ascii.getString(byte[])代替。
(作者写的的我还没完全理解全,剩下的几点,稍后再写)