Unicode编码之我见
先从编码说起吧,计算机只认识二进制,为了能让计算机识别,我们就定义一个编码标准吧.于是就有了ASCII.
ASCII编码是目前计算机最通用的编码标准。ASCII编码用一个字节存储,因此最多能表示256个字符。
这256个字符对于英语国家来说,足够了,但对于中文等繁杂的文字系统,却远远不够,为了解决这一问题, 国际组织制定了Unicode编码,
它为每种语言中的每个字符设定了唯一的二进制编码.
它是一种可以容纳世界上所有文字和符号的字符编码方案 。
Unicode定义了字符编码方案,但没定义具体实现方案.
根据实现方案不同,分为UTF-8、UTF-16、UTF-32. UTF-8,UTF-8是互联网上使用最广的一种存储方案.
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,我们可以用UltraEdit中的”十六进制功能“查看文件的编码,
Unicode编码的文件会以FF FE开头
Unicode big endian (大头方式存储)编码的文件会以FE FF开头
UTF-8 编码的文件会以EF BB BF开头
Unicode 编码转换
Json传输中文时为了防止乱码,通常我们会进行Unicode编码 ,如{userID:"001",nickname:"\u65e0\u8bed\u68a6" }
下面的代码,将能完成Unicode的与普通字符的转换功能
1 /// <summary>
2 /// 将单个Unicode字符串转换为普通文字,如\u65e0转换为普通文字时,请这样调用ConvertStr("65e0")
3 /// </summary>
4 /// <param name="unicodeStr"></param>
5 /// <returns></returns>
6 private string ConvertStr(string unicodeStr)
7 {
8 if (unicodeStr.Length != 4)
9 {
10 return String.Empty;
11 }
12
13 byte byteAfter = Convert.ToByte( unicodeStr.Substring(0,2),16);
14 byte byteBefore = Convert.ToByte(unicodeStr.Substring(2), 16);
15
16 return System.Text.Encoding.Unicode.GetString(new byte[] { byteBefore, byteAfter });
17 }
18
19 /// <summary>
20 /// 将单个字符转换为16进制的Unicode字符串
21 /// </summary>
22 /// <param name="str"></param>
23 /// <returns></returns>
24 public string ConvertUnicode(string str)
25 {
26 Byte[] arrByte = System.Text.Encoding.Unicode.GetBytes(str);
27
28 string strAfter = Convert.ToString(arrByte[0],16);
29 string strBefore = Convert.ToString(arrByte[1],16);
30
31 return strBefore + strAfter;
32 }
2 /// 将单个Unicode字符串转换为普通文字,如\u65e0转换为普通文字时,请这样调用ConvertStr("65e0")
3 /// </summary>
4 /// <param name="unicodeStr"></param>
5 /// <returns></returns>
6 private string ConvertStr(string unicodeStr)
7 {
8 if (unicodeStr.Length != 4)
9 {
10 return String.Empty;
11 }
12
13 byte byteAfter = Convert.ToByte( unicodeStr.Substring(0,2),16);
14 byte byteBefore = Convert.ToByte(unicodeStr.Substring(2), 16);
15
16 return System.Text.Encoding.Unicode.GetString(new byte[] { byteBefore, byteAfter });
17 }
18
19 /// <summary>
20 /// 将单个字符转换为16进制的Unicode字符串
21 /// </summary>
22 /// <param name="str"></param>
23 /// <returns></returns>
24 public string ConvertUnicode(string str)
25 {
26 Byte[] arrByte = System.Text.Encoding.Unicode.GetBytes(str);
27
28 string strAfter = Convert.ToString(arrByte[0],16);
29 string strBefore = Convert.ToString(arrByte[1],16);
30
31 return strBefore + strAfter;
32 }