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
}
/// <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
}



浙公网安备 33010602011771号