日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用8位字节的编码格式将字节流安全的转换成String

發布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。