C#编码 .

本文深入探讨了.NET环境中字符串编码与字节序列之间的转换过程,包括Unicode、UTF-8、默认编码及UTF32等,详细解释了编码方式与实际输出的关系,以及如何正确读取和处理不同编码格式的文件流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 string str = "我是中国人";
            //Encoding encoding = Encoding.GetEncoding(str);
            Encoding unicode = Encoding.Unicode;
            Encoding utf8 = Encoding.UTF8;
            Encoding default1 = Encoding.Default;
            Encoding utf32 = Encoding.UTF32;
            byte[] byte1 = unicode.GetBytes(str);
            byte[] byte2 = utf8.GetBytes(str);
            byte[] byte3 = default1.GetBytes(str);
            byte[] byte4 = utf32.GetBytes(str);
            //byte[] byte5 = .GetBytes(str);
            Console.WriteLine("enUnicode:{0}", byte1.Length);
            Console.WriteLine("utf8:{0}", byte2.Length);
            Console.WriteLine("default{0}", byte3.Length);
            Console.WriteLine("utf32:{0}", byte4.Length);
            Console.WriteLine("utf32:{0}", Encoding.UTF8.GetString(byte2));
            string str2 = Encoding.UTF32.GetString(byte4);
            string str3 = Encoding.Unicode.GetString(byte1);
            Console.WriteLine(str3.ToString());
            Console.WriteLine(str);
            //HttpRequest.ContentEncoding 
            // Encoding encoding = Encoding.GetEncoding("gb2312");
            //IEnumerable<string[]> entries = File.ReadAllLines(fileInfo.UpperCasePath, Encoding.GetEncoding("Shift_jis"))

            string text = "%B3%C2%B8%A3%D0%CB";
            string keyword = HttpUtility.UrlDecode(text, Encoding.GetEncoding("GB2312"));
            string fds = HttpUtility.UrlEncode(keyword,Encoding.GetEncoding("GB2312"));

            byte[] ascii = Encoding.ASCII.GetBytes(s);

.NET中的String确实只有Unicode一种。所以编码格式的字节序列转换成String时最终都是以Unicode表示。转换成String后它以后的编码格式已经不重要或者说没有意义了。
System.Text.Encoding.Default是取系统的当前ANSI代码页的编码(MSDN上抄的),即当前系统的编码。(在我们的机子上一般都是 "gb2312 ")这就是我每次用Default读取文件流都正确,且必须用Default读取才正确的原因----其实用Encoding.GetEncoding( "GB2312 ")也一样。

详细介绍:
在每次进行byte[]--> String(other--> Unicode)和String--> byte[](Unicode--> other)时都会有编码转换。
比如通常的转换都有设置编码的地方,如StreamReader(string   path   [,   System.Text.Encoding   encoding]),Response.Charset,这就相当于你告诉系统byte[]是什么编码,这时候.NET用你指定的编码方式去解码,然后转换成Unicode编码方式的String.
也就是说,不管何时,我们所指定的编码都只是指byte[]。
即Encoding.UTF8.GetString(byte[]   buffer)是告诉系统buffer的编码是UTF8。
byte[]   buf   =   Encoding.UTF8.GetBytes(string   str)是告诉系统返回的buf编码方式是UTF8。

你可能告诉系统一个假的编码方式,或者你没有告诉系统并且byte[]的编码不是用的默认编码,那么系统解码仍然会用指定编码方式进行,在机器看来他仍然解码成功,然后转换成Unicode编码,因为机器只知道0,1字节序,他不知道解码出来的东西是否是混乱的,在他看来一切正常。
但我们去看,就会发现字符串成了一些莫名其妙的符号而没有任何意义,这就是所谓的乱码。
就好比: "you   yi   ge ",本来是拼音 "有一个 ",你却偏偏告诉别人这是英语,别人用英语去拼,就不知道是怎么回事了,就成了乱码,呵呵。
即:字节序是按指定编码方式编码,它有一个特定的编码方式,但它本身是中性的,不含有任何编码信息。

编码方式理论上是独立于语言的,但实际上需要语言去支持。如JAVA中有 "GBK "(gb2312扩展)编码,但.NET中没有。你用Encoding.GetEncoding( "GBK ")会抛异常。
http://topic.youkuaiyun.com/t/20050512/19/4002354.html

很好的一篇文章解释了Unicode和gb2312,UTF-8的区别于联系http://tech.ddvip.com/2008-11/122794544296212.html

也不错的编码文章:http://www.cnblogs.com/yasin/articles/1404064.html

http://www.cnblogs.com/namek/

转自:http://blog.youkuaiyun.com/helloguonan/article/details/7106582

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值