我们常用的编码格式有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相关推荐

  1. 快手,字节面试题,将IP地址转换成整数类型,再转换回来。C++代码

    题目描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成 一个长整数. 举例:一个ip地址为10.0.3.193 每段数字       ...

  2. 三菱plc两个16转换32位_三菱FX2NPLC如何将十进制数转换成十六进制-专业自动化论坛-中国工控网论坛...

    发表于:2010-08-20 12:42:43 18楼 7.1.4 十进制数转换成二.十六进制数 1 方法一 口诀:除N取余,逆序排列. [例3]K 200=B? 200÷2 = 100•••0 LS ...

  3. java 8个字节转一位_8个字节的16进制数 怎么转换成10进制数

    Java codeimport java.util.Arrays;public class ChangeBytesToNumber{ public static void main(String[] ...

  4. java中float类型占4个字节,long类型占8个字节,为什么long类型能自动转换成float类型,且float类型为什么表示的范围比long类型大

    作为常识我们都知道,float型在内存中占用的是4个字节,而long型占用8个字节.单从字节数来看,long型是大于float型的.但实际上,float表示的范围却是比long要大的 float类型的 ...

  5. mysql gbk编码 字节数,mysql中utf-8编码数据库转换成GBK编码的问题

    摘要 腾兴网为您分享:mysql中utf-8编码数据库转换成GBK编码的问题,之了课堂,易信,一折包邮,星球联盟等软件知识,以及七日杀,草莓软件,装修施工站,桔子会,桌面切换,看小说神器,酷派应用商店 ...

  6. nodejs将图片的像素值提取出来将RGBA转换成16位彩色

    nodejs将图片的像素值提取出来将RGBA转换成16位彩色 RGBA转16位彩色的原理 RGBA由4*8bit组成(255, 255, 255,255),16位彩色为2*8bit组成.16位彩色需要 ...

  7. 【学习笔记】简易的24位BMP图片转换成灰度图片

    简易的24位BMP图片转换成灰度图片的C语言实现 使用C语言实现的一个简易的24位BMP图片转换成灰度图片的程序.需要先准备一张24位的BMP图片. 说明 RGB图片转换成灰度图片主要是使用这个公式: ...

  8. 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

    此文章参考<深入理解计算机系统>P31. 先看如下代码:  12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...

  9. java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

    [Java教程]Java字节流与字符流的区别 0 2017-05-22 12:00:42 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身 ...

最新文章

  1. 树莓派系统安装_树莓派系统安装
  2. python中remove函数是什么意思,python中pop函数和remove函数有什么区别
  3. 阿里云分布式容器平台即将全面启动公测
  4. mysql dal_Entity Framework连接Mysql数据库并生成Model和DAL层
  5. python是一种动态语言这意味着_Python如何能成为全球最受欢迎的编程语言?该不该学Python?...
  6. 【初探移动前端开发03】jQuery Mobile(上)
  7. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)
  8. 【渝粤教育】 国家开放大学2020年春季 2710蔬菜栽培技术 参考试题
  9. php实现第三方邮箱登录_JavaScript实现第三方登录网站原理在这呢
  10. 【Scrapy】Unsupported major.minor version 52.0 [duplicate]
  11. ie8 html 语音标签,让IE8支持html5中的video标签
  12. [转载] Python 中 pass 语句的作用是什么?
  13. Android之腾讯Bugly采集用户Bug
  14. 服务器appcrash的问题怎么修复,APPCRASH问题如何解决
  15. PLG SaaS 案例:如何实践外链自动增长策略?
  16. 中国人的英文名和外国人的中文名
  17. i7 11700k、i7 11700f和i7 11700KF选哪个
  18. 深度学习-BP神经网络(python3代码实现)
  19. python变量的声明和赋值
  20. 公众号文章排版样式——隐藏样式

热门文章

  1. 简单电商购物过程(续1)
  2. Django—模板渲染
  3. Resilio(BtSync)搭建
  4. ExpressionFuncT,TResult和FuncT,TResult
  5. LINUX下安装ORACLE,完全搞定
  6. Linux性能测试 KSysguard工具
  7. cnil在python_在Python中使用cumprod()计算权益曲线
  8. Python 实现图片质量比较之PSNR和SSIM
  9. 3.4 多个例子中的向量化-深度学习-Stanford吴恩达教授
  10. DFT实训教程笔记3(bibili版本)-SOC Scan Implementtation Scan Practice Session II