编码、编码,还是编码

喔,似乎编码问题很容易被解决,也很容易造成误解,尤其是在不同系统交互的时候,特别是当传递的数据中包含中文的时候。

在中文的编码上有太多的差异,有的系统喜欢用GB2312,有的系统却采用UTF-8。

还有在网页上,Content-Type也有多种写法,有的爱好GB2312,其他的喜欢UTF-8等等。

很多系统中会用到MD5哈希进行数据校验,尤其是提供接口的时候,当这个时候编码不相同的话,就会出现很多头疼的问题,如果找不到原因,你或许还会埋怨这谁发明的C#语言,竟然MD5算法的结果不一样?!

当然,如果在接口间传递的数据不是非英文的话,一般是不会出现的,但是成产环境中,非英文的数据是很多的。

因此我们需要找到真正的解决办法来融合不同的系统。这里举一个小例子。

有一个第三方接口以HTTP方式提供,程序是用JAVA写的,提供的数据是GB2312编码的xml文件,现在你要用.NET来封装这个接口的实现,其中有些方法需要中文数据和MD5哈希校验,而你的系统是UTF-8编码。

找到问题在于编码的不同,就已经解决了90%,剩下的就只有需要一个算法了。

 

Code
/// <summary>
/// 指定字节流编码计算MD5哈希值,可解决不同系统中文编码差异的问题。
/// </summary>
/// <param name="source">要进行哈希的字符串</param>
/// <param name="bytesEncoding">获取字符串字节流的编码,如果是中文,不同系统之间请使用相同编码</param>
/// <returns>32位大写MD5哈希值</returns>
public static string ComputeMD5(string source, Encoding bytesEncoding)
{
byte[] sourceBytes = bytesEncoding.GetBytes(source);

MD5CryptoServiceProvider md5
= new MD5CryptoServiceProvider();

byte[] hashedBytes = md5.ComputeHash(sourceBytes);

StringBuilder buffer
= new StringBuilder(hashedBytes.Length);
foreach (byte item in hashedBytes)
{
buffer.AppendFormat(
"{0:X2}", item);
}

return buffer.ToString();
}

 

编码问题其实真的很头疼。

posted @ 2008-11-06 15:08  亮小猪  阅读(500)  评论(0)    收藏  举报