C#EncodingUTF-16,C#中的UTF16
前⾔
众所周知计算机只能识别⼆进制数字,如1010,1001。我们屏幕所看到的⽂字,字符都是和⼆进制转换后的结果。将我们的⽂字按照某种规则转换⼆进制存储在计算机上,这⼀个过程叫字符编码,反之就是解码。⽬前存在多种字符编码⽅式,⼀组⼆进制数字根据不同的解码⽅式,会得到不同的结果,有时甚⾄会得到乱码。这也就是为什么我们打开⽹页时有时会是乱码,打开⼀个⽂本⽂件有时也是乱码,⽽换了⼀种编码就恢复正常了。CLR中的所有字符都是16位Unicode来表⽰的。CLR中的Encoding就是⽤于字节和字符之间的转换的。更多字符编码知识请参考,
关于Encoding
CLR中的Encoding是在System.Text命名空间下的,它是⼀个抽象类(abstract class),所以不能被直接实例化,它主要有如下的派⽣类:ASCIIEnding,UnicodeEncoding,UTF32Encoding,UTF7Encoding,UTF8Encoding,你可以根据需要选择⼀个合适的Encoding来进⾏编码和解码。你也可以调⽤Encoding的静态属性ASCII,Unicode,UTF32,UTF7,UTF8,来构造⼀个Encoding。其中Unicode是表⽰16位Encoding。调⽤静态属性和实例化⼀个⼦类的效果是⼀样的,如下代码。
1 Encoding encodingUTF8 = Encoding.UTF8;
2 Encoding encodingUTF8 = new UTF8Encoding(true);
以下是这些类型的⼀些简单描述:
unicode字符转中文ASCII编码将16位字符编码成ASCII码,只能转换值⼩于Ox0080的16字符,并且被转换成单字节,就是说⼀个字符对应⼀个字节。当字符都在ASCII范围(0X00~0X7F)内时,可以⽤这种编码,它的速度⾮常快,适合于英美地区的字符。这种编码⾮常有限,汉字会被转换成乱码。在CLR对应ASCIIEndoing。
UTF-16 每个字符编码成2个字节,它不会对字符产⽣任何影响,也不会涉及到压缩处理,性能⾮常好,因为CLR中的字符也是16位的Unicode。在CLR中对应UnicodeEncoding。
UTF-32 使⽤4个字节编码成⼀个字符。从内存⾓度上讲,它并不是⼀种⾼效能的编码⽅案,因为第个字符都是4个字节,特别占内存,所以很少⽤来做⽂件和⽹络流的编码解码。在CLR中对应UTF32Encoding。
UTF-8 值在Ox0080之下的字符压缩成⼀个字符,也就是ASCII码;值在0X0080---0X07FF之间的字符都转换成2个字符,适合⽤于欧洲和中东地区。0X0800以上被转换成3个字符,适合于东亚地区的字符。代理项被转换成4个字节。因此,它是⼀种⾮常流⾏的编码,适⽤于互联⽹。它在处理0X0800以上的字符效率不好UTF-16。在CLR中对应UTF8Encoding。
UTF-7 这咱编码通常⽤于旧的系统,那时的系统是⽤7位值表⽰。⽬前已经被Unicode协淘汰。在CLR中对应UTF7Encoding。
从性能⾓度上来讲,如果你的代码需要在多处调⽤⼀个Encoding,微软建议你使⽤静态成员的⽅式构造⼀个Encoding对象,⽽不是构造实例。它的内部实现是⼀个单例模式。
public static Encoding UTF8
{
get
{
if (utf8Encoding == null)
{
utf8Encoding = new UTF8Encoding(true);
}
return utf8Encoding;
}
}
如果你知道某种编码的代码页(code page)或名字,那么你可以调⽤Encoding的静态⽅法GetEncoding(int
codepage),GetEncoding(string name)来构造⼀个Encoding,⽐如我们常⽤的⽤于显⽰简体中⽂的gb2312,它的代码页是936,我们就可以这样定义:
Encoding encodingGB2312=Encoding.GetEncoding("gb2312");
Encoding encodingGB2312=Encoding.GetEncoding(936);
⽬前有⼏⼗种⽂字代码页,分别对应于不同的国家,不同的语⾔,它们只是对应Unicode字符集⾥的相⼀部分,⽐如说936,它只是对应于Unicode字符集⾥简体中⽂的那⼀部分,如果你想正确的显⽰繁体字,那么就要⽤中⽂繁体对应的代码页950。具体的代码页有哪些可以参考MSDN或园⼦⾥这篇⽂章,。
下⾯代码可以返回CLR中所有的Encoding。
foreach (EncodingInfo eInfo in Encoding.GetEncodings())
{
Console.WriteLine("Encoding code page is {0}, encoding name is {1}", eInfo.CodePage, eInfo.Name);
Console.WriteLine("Encoding dispaly name is {0}", eInfo.DisplayName);
}
Encoding对象有⼀个静态属性Default,它返回的也是⼀个Encoding对象,⾄于返回哪个语⾔的Encoding取决于你电脑⾥-->控制⾯板->区域和语⾔⾥⾯的设置,也就是ANSI。如下图,我电脑⾥设置是Chinses(Simplified, PRC)也就是简体中⽂,那么对应的就是gb2312,所以下⾯代码会打印gb2312。如果你的代码在不⽌⼀个国家⾥使⽤,那么你最好不要Encoding.Default,这样会造成乱码,你最好⽤Encoding.UTF8。
Encoding encoding1 = Encoding.Default;
Console.WriteLine(encoding1.WebName);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论