使用8位字节的编码格式将字节流安全的转换成String
时间:2022-04-28
本文章向大家介绍使用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(" ");
}
}
/// <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组件终于可以安全的处理多种格式的邮件了。
- Reactive Extensions(Rx) 学习
- 发布一个日期选择控件(ASPNET2.0)
- 做程序员压力山大,很多人都快疯了
- 小程序让交通出行变得如此简化,看看这些微信小程序你有在用了吗?
- 中小企业如何选择DDoS防御方案?
- “熊医生”出诊正确率超九成 医院:人工智能更多是辅助
- PLC编程优化方法,让程序运行提速!
- 这是硅谷狂人马斯克对未来做出的11个大胆预测,人工智能比核武器更危险
- 在腾讯云上使用自建DNS
- Spring 4.0.2 学习笔记(1) - 最基本的注入
- 关于女神SQLite的疑惑(2)
- WordPress纯代码仿无觅相关文章图文模式功能(增强版)
- 人工智能时代已悄然来临……
- 人民日报发布周鸿祎署名文章:迎接“大安全”时代的新威胁
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 线性表--顺序表--循环链表(五)
- java学习之路:1.编译器Eclipse安装教程
- 指针作形参,需要注意的问题。
- SetConsoleTextAttribute函数用法
- C语言俄罗斯方块(旧版本)
- 线性表--顺序表--数组(三)
- 算法复杂度(二)
- 线性表--顺序表--单向链表(四)
- C语言俄罗斯方块(新版本完整代码)
- 线性表--顺序表--双向链表(六)
- C/C++什么时候使用二级指针,你知道吗?
- 萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
- 萌新不看会后悔的C++string字符串常用知识点总结
- salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
- CodeForces - 260C