一、先普及一下基本知识
编码指不同国家的语言在计算机中的一种存储和解释规范
ANSI与ASCII
最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符,充分利用了一个字节所能表达的最大信息
nANSI字符集:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。
UNICODE与UTF8,UTF16
由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符
标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式)
例如“连通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90
而其UTF-8编码为:E8 BF 9E E9 80 9A
当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,
二、.Net 中字符串编码的转换
例如:转换成UTF8
.NET 中默认字符串是Unicode
byte[] sourcebytes = System.Text.Encoding.Default.GetBytes(sUnicode);
byte[] targetbytes=System.Text.Encoding.Convert(Encoding.Unicode, Encoding.UTF8, tmpbytes);
string UTF8string = System.Text.Encoding.UTF8.GetString(targetbytes);
文本文件的编码问题
读文件
StreamReader sr = new StreamReader(filename)
StreamReader会检查字节码标记,确定编码方法
如果指定UTF8编码方法
StreamReader sr = new StreamReader(filename,
Encoding.UTF8);
写文件
using(StreamWriter sw = new StreamWriter(filename))
{
sw.Write(buffer);
sw.Close();
}
上面的代码使用了UTF8编码方法,.NET把这种编码方法设置为默认的编码方法