使用8位字节的编码格式将字节流安全的转换成String
我們常用的編碼格式有ASCII,Unicode,UTF-8,GB2312等,如何在這些編碼之間安全轉換呢?
最近做郵件系統,采用了OpenPOP組件,這是老外寫的,沒想到用到中文環境中,出了很多問題,主要就是編碼問題。
通常,郵件內容都會經過Base64編碼,在郵件接收端,需要對其解碼,得到字節流,再進一步解碼為正確的字符串,如 Base64.cs文件中:
?
?public?static?class?Base64????{
????????public??static?byte[]?DecodeToBytes(string?strText)
????????{
????????????try
????????????{
????????????????return?Convert.FromBase64String(strText);
????????????}
????????????catch?(Exception?e)
????????????{
????????????????Utility.LogError("decodeToBytes:"?+?e.Message);
????????????????
????????????????return?Encoding.Default.GetBytes("\0");
????????????}
????????}
????????///?<summary>
????????///?Decoded?a?Base64?encoded?string?using?the?Default?encoding?of?the?system
????????///?</summary>
????????///?<param?name="base64Encoded">Source?string?to?decode</param>
????????///?<returns>A?decoded?string</returns>
????????public?static?string?Decode(string?base64Encoded)
????????{
????????????//有可能因為二進制問題不能正確解碼?dth,2010.12.15
????????????//return?Encoding.Default.GetString(DecodeToBytes(base64Encoded));
????????????//ISO8859-1?字符串,8位,只有這種可以完整保留二進制
????????????Encoding?_encoding?=?Encoding.GetEncoding(28591);
????????????return?_encoding.GetString(DecodeToBytes(base64Encoded));
????????}
????????///?<summary>
????????///?Decoded?a?Base64?encoded?string?using?a?specified?encoding
????????///?</summary>
????????///?<param?name="base64Encoded">Source?string?to?decode</param>
????????///?<param?name="nameOfEncoding">The?name?of?the?encoding?to?use</param>
????????///?<returns>A?decoded?string</returns>
????????public?static?string?Decode(string?base64Encoded,?string?nameOfEncoding)
????????{
????????????try
????????????{
????????????????return?Encoding.GetEncoding(nameOfEncoding).GetString(DecodeToBytes(base64Encoded));
????????????}
????????????catch(Exception?e)
????????????{
????????????????Utility.LogError("decode:?"?+?e.Message);
????????????????return?Decode(base64Encoded);
????????????}
????????}
????}
?
其中有一個方法Decode,這是原來的代碼:
public?static?string?Decode(string?base64Encoded)
????????{
???????????????return?Encoding.Default.GetString(DecodeToBytes(base64Encoded));
?????????}
原作者使用了 Encoding.Default 編碼格式來獲取字符串,在英文環境或許沒有問題,但如果發信方用的編碼格式跟你不一樣,這樣就會出問題,比如對方是UTF-8編碼,而自己的默認編碼是GB2312。
另外一種情況就是對于Base64編碼的二進制數據,比如郵件中的圖片等,原代碼的方式更是成問題,我們的Encoding.Default 編碼會破壞原始的二進制字節信息,但這些信息又想作為字符串在系統中使用,該怎么辦呢?
二進制字節都是8位編碼的,只有采用8位編碼格式的方案才可以完整保留二進制數據。在所有的系統編碼中,ISO8859-1 是8位編碼,所以我們采用它來作為系統中
byte[] <=> String
轉換的橋梁,我對原始代碼做了修改,成為下面的樣子:
?public?static?string?Decode(string?base64Encoded)
????????{
????????????//有可能因為二進制問題不能正確解碼?bluedoctor,2010.12.15
????????????//return?Encoding.Default.GetString(DecodeToBytes(base64Encoded));
????????????//ISO8859-1?字符串,8位,只有這種可以完整保留二進制
????????????Encoding?_encoding?=?Encoding.GetEncoding(28591);
????????????return?_encoding.GetString(DecodeToBytes(base64Encoded));
????????}
對系統中所有類似的地方進行修改,OpenPOP組件終于可以安全的處理多種格式的郵件了。
?
總結
以上是生活随笔為你收集整理的使用8位字节的编码格式将字节流安全的转换成String的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【探索】Web新概念——资料横向显示(欢
- 下一篇: 构建基于Nginx的web服务器