string编码的理解
来源:互联网 发布:编程用什么笔记本好 编辑:程序博客网 时间:2024/04/29 03:24
新一篇: 生成随机数的字符串
(去年没事时写的 )
误区:
1.入门C#时经常看到这样的描述:.NET中的String都是Unicode编码。
在入门之后没太看这样的基础书并且多接触一些编码问题后,我的潜意识总觉得String有很多种编码,utf8,unicode,ascii等,并且不认为C#中有gb2312编码。
2.System.Text.Encoding.Default似乎可以解决一切编码,因为我每次用Default.GetString()来读取流中的字符串都成功!所以Default应该是根据字节的编码方式而改变的,比如如果你的字节序是ascii编码,那么Default就是ascii编码。
只到前几天在CSDN的Java社区看到一个编码问题,外加自己的几个小时的实验,终于对编码问题理清了头绪。
简短描述:
.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")会抛异常。
- string编码的理解
- string编码的理解
- string编码的理解收藏
- String的getBytes()以及Java编码格式理解
- 编码的理解
- PYTHON编码的理解
- asn1编码的理解
- python编码的理解
- base64编码的理解
- 编码的理解
- Java中char和String 的深入理解 - 字符编码1
- 对String的理解
- string 的理解
- string的理解
- 关于string的理解
- String内部的理解
- string::size_type 的理解
- String的理解
- Observer Pattern
- SE手机上网&彩信设置
- 方便入门的专业输入法
- 关于java日期的函数
- 学会无知
- string编码的理解
- 有了SQL Server 2005 JDBC还需要SQL Server 2000 JDBC吗?
- C#类的继承机制
- 凯撒 加密 解密
- C/C++编程中常遇到的问题
- 角色,创建,授权
- 日记变迁
- java 字符集s
- 数据显示IT员工普遍变得更胖了... [我为什么胖不了?]