首先,在CLR中所有的字符都被表示为16位的Unicode码值,所有的字符串都是由16位的Unicode码值组成。
16位的Unicode编码可以表示当今世界上的所有字符,所以,不必为字符的不同而担心保存的方式,这给字符的转换会很方便。
但是字符串保存在CLR中,如果我们需要呈现出来,比如写入文本文件,写入网络流,如果按照这样的方式,可能会很浪费空间,比如是英文字符就不需要这么宽的长度来保存,并且对于特定的字符集,比如中文字符集,这些是需要特定的代码页来编码的,如GB2312等等。
编码方式主要有:
UTF-16:一个16为字符编码为两个字节,性能最好,但是占用空间较大。
UTF-8:按需分配字节数。
ASCII:单字节编码,只适用于英文字符。
UTF-8:当今世上最流行的编码方式,它可以按照码值灵活安排字节数,也就是存储空间。所以我们在应用的时候应该尽量使用UTF-8或UTF-16这样的编码方法来进行字符串的编码。因为这样很安全,不会出现不认识的字符。 UTF16把16位字符编码为2个字节,而UTF8则有四种可能,比如英文字符他会编码为一个字节,一些欧洲和中东语言,它会编码为两个字节,一些东亚地区的语言它会编码成三个字节,代理字符会被转换为4个字节。
当然.NET还允许把字符编码到指定的代码页中,比如GB2312。但是一旦出现指定代码页中没有的字符,将不能正确呈现。
见下面代码:
using System;
using System.Collections;
using System.Text;
public class MyClass
{
public static void Main()
{
RL();
string s = "大XXYYZZ";
Encoding gbk = Encoding.GetEncoding("GB2312");
byte[] u8Bytes = Encoding.UTF8.GetBytes(s);
byte[] u16Bytes = Encoding.Unicode.GetBytes(s);
byte[] gbkBytes = gbk.GetBytes(s);
//此处打印转换过来的字节码
Console.WriteLine("UTF8Bytes: " + BitConverter.ToString(u8Bytes));
Console.WriteLine("UTF16Bytes: " + BitConverter.ToString(u16Bytes));
Console.WriteLine("GBKBytes: " + BitConverter.ToString(gbkBytes));
RL();
//用Utf8进行解码
Console.WriteLine("UTF8Bytes: " + Encoding.UTF8.GetString(u8Bytes));
Console.WriteLine("UTF16Bytes: " + Encoding.UTF8.GetString(u16Bytes));
Console.WriteLine("GBKBytes: " + Encoding.UTF8.ToString(gbkBytes));
RL();
//用Unicode进行解码
Console.WriteLine("UTF8Bytes: " + Encoding.Unicode.GetString(u8Bytes));
Console.WriteLine("UTF16Bytes: " + Encoding.Unicode.GetString(u16Bytes));
Console.WriteLine("GBKBytes: " + Encoding.Unicode.GetString(gbkBytes));
RL();
//用GB2312进行解码
Console.WriteLine("UTF8Bytes: " + gbk.GetString(u8Bytes));
Console.WriteLine("UTF16Bytes: " + gbk.GetString(u16Bytes));
Console.WriteLine("GBKBytes: " + gbk.GetString(gbkBytes));
RL();
}
Helper methods#region Helper methods
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
#endregion
测试的结果为:
可以看出,对应的字节一定要对应的解码才能正确体现出来,用GB2312对中英文混和的字符串最节省空间,UTF8也是比较节约的,只是一个汉字占用了三个字节,UTF16可能对中英文混和的字符编码效率最好,但是占用空间也最多,这样看来各有千秋,要根据我们的应用场合来决定编码了。