使用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组件终于可以安全的处理多种格式的邮件了。



    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2011/03/11/1980626.html,如需转载请自行联系原作者


相关文章
|
8月前
|
编译器 C++
【编码艺术:掌握String类函数接口的妙用指南】(三)
【编码艺术:掌握String类函数接口的妙用指南】
|
8月前
|
C语言 C++ 容器
【编码艺术:掌握String类函数接口的妙用指南】(一)
【编码艺术:掌握String类函数接口的妙用指南】
|
8月前
|
存储 Linux C语言
【编码艺术:掌握String类函数接口的妙用指南】(二)
【编码艺术:掌握String类函数接口的妙用指南】
|
5月前
|
存储 NoSQL 索引
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
MPP架构数据仓库使用问题之在ORC文件中,String类型字段是怎么进行编码的
|
6月前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
|
7月前
|
存储 缓存 负载均衡
【Redis】 String类型的内部编码与使用环境
【Redis】 String类型的内部编码与使用环境
|
8月前
|
存储 Linux C++
【编码艺术:掌握String类函数接口的妙用指南】(四)
【编码艺术:掌握String类函数接口的妙用指南】
|
存储 NoSQL 安全
Redis之string类型的三大编码解读
Redis之string类型的三大编码解读
|
存储 JSON NoSQL
【Redis从头学-4】Redis中的String数据类型实战应用场景之验证码、浏览量、点赞量、Json格式存储
【Redis从头学-4】Redis中的String数据类型实战应用场景之验证码、浏览量、点赞量、Json格式存储
221 0
|
存储 JSON Go
Golang String字符串类型转Json格式
go的string字符串格式转json格式 确实有点麻烦,如果不知道json里面的类型好像就构建不了结构体了。
2481 0