乱码问题,是对中文系统的一个挑战,只要你在中文环境下做开发,如果没有遇到乱码,那是你的福份,应该谢天谢地。
近些天做了一个小应用,用来解析MMS GW 发来的 MO,MO的封包规则很简单,仅仅采用MIME封装的base64格式,然后将MIME包写入XML字符串,通过HTTP传输。多么简单的冬冬啊,但是问题出现,当本人自认为音档,图片档,视频档都已经顺利处理后,才发现文本档的存储出现乱码问题!于是乎继续敲击键盘,需求正解。
之前看过很多关于乱码的文章,也处理过很多乱码的问题,但本次,没能搞定!以下简单描述一下过程和本人的解决之道:
1、MIME封装时,文本已经是UTF-8编码格式,当封装MIME时,Content-Transfer-Encoding设置成base64。
2、经过查询MMS GW端的base64格式的文本字符串与Client端log中的文本字符串一模一样。(请注意:上面已经说明,mime包被封装进XML中,并以http方式传输)
3、乱码问题
采用javax.mail.internet.MimeMultipart读取MIME,部分代码如下
String moContent;//mime包字符串流
String contenttype;//boundary分割标识
MimeMultipart content = new MimeMultipart(new javax.mail.util.ByteArrayDataSource(moContent, contenttype));
if (content != null) {
MimeAnalyzer mimeAnalyzer = new MimeAnalyzer();
IMediaElement[] attachments = mimeAnalyzer.getAttachments((MimeMultipart) content);
if (attachments != null) {
for (int i = 0; i < attachments.length; i++) {
//此处获得的byte[] 是有问题的,并不是正确的,因此导致中文出现乱码。如果有了解内情的高手,请指点迷津,不胜感激
byte[] mmsBody = attachment.getContent();
}
}
}
4、解决方案
虽然通过byte[] mmsBody = attachment.getContent();获取的字节流存在问题,但MIME字符流本身是正确的,因此采用如下方式获取正确的文本字符串,代码如下:
String moContent;//mime包字符串流
String contenttype;//boundary分割标识
MimeMultipart content = new MimeMultipart(new javax.mail.util.ByteArrayDataSource(moContent, contenttype));
//写入新的MIME
MimeMessage message =new MimeMessage();
int num = content.getCount();
for (int i = 0; i < num; i++) {
message.addBodyPart(content.getBodyPart(i), i);
}
if (content != null) {
MimeAnalyzer mimeAnalyzer = new MimeAnalyzer();
IMediaElement[] attachments = mimeAnalyzer.getAttachments((MimeMultipart) content);
if (attachments != null) {
for (int i = 0; i < attachments.length; i++) {
//与之前的获取byte方式不同,请注意
if( attachment.getContentType().toString().indexOf("text")>=0){
BufferedReader input = null;
try {
input = new BufferedReader(new InputStreamReader(message.getBodyPart(i).getInputStream()));
String tempStr = input.readLine();
StringBuffer bs = new StringBuffer("");
while (tempStr != null) {
bs.append(tempStr);
tempStr = input.readLine();
}
byte[] mmsBody = bs.toString().getBytes();
} catch (Exception e) {}
try {
if(input!=null){input.close();}
} catch (IOException e) {}
}
}
}
}
5、费解之处
本人一直没有找到为何直接获取文本字节流( attachment.getContent()),这种方式出现乱码的原因,在我的测试环境中,采用同一台server测试,所以排除系统环境和JVM环境的字符集不同问题。望有解的高手请告知,谢谢!
分享到:
相关推荐
MIME-Base64-3.01.tar.gz
Base64是MIME邮件中常用的编码方式之一。它的主要思想是将输入的字符串或数据编码成只含有{ A - Z , a - z , 0 - 9 , + , / }这64个可打印字符的串,故称为“Base64”。
Base64编解码是MIME协议中的一种常用的编码方式,用于将二进制数据转换为文本数据,以便在电子邮件中传输。下面是 Base64 编解码的知识点: 1. 什么是Base64编解码? Base64编解码是一种编码方式,用于将二进制...
离线安装包,亲测可用
总结来说,"Base64文件图片编码解码双向转换解析预览工具"是一款实用的应用,涵盖了Base64编码与解码的核心功能,特别适合于处理图片和文件的在线转换,而且其预览和暗色背景设计考虑了用户体验,使得处理透明图片...
离线安装包,亲测可用
虽然`sun.misc`包中的这些类不推荐在新代码中使用,但Java 8引入了`java.util.Base64`类,它提供了正式支持的BASE64编码和解码功能。`Base64`类提供了更稳定、更健壮且功能丰富的接口,包括对URL和MIME类型的编码...
在网页开发中,有时我们需要将Base64编码的字符串直接作为图片显示出来,这在Thymeleaf框架中可以通过特定的方式实现。Base64是一种数据编码方式,它将二进制...这样,浏览器就能正确地解析和显示Base64编码的图片。
这是因为Base64能够将任何二进制数据转化为纯文本形式,便于在网络传输中不被错误地解析或损坏。 Base64的基本原理是将每3个8位字节(24位)的数据转换为4个6位字节(24位)的数据,然后在每个6位字节前添加两个...
Base64是一种编码方式,常用于在网络上传输二进制数据,因为许多协议(如电子邮件的MIME)只允许ASCII字符。在这个“base64加密jar包”中,包含了一个名为`sun.misc.BASE64Decoder.jar`的文件,它是Java的一个内置...
Base64编码是一种广泛使用的数据编码方式,尤其在互联网通信和文本存储中扮演着重要角色。它将任意可打印字符转换成一个特定的64字符集合的表示形式,以确保数据在传输过程中不受字符集限制,同时保持文本的不可读性...
乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64, Quoted-Printable,HZ和UUCode四种形式的编码和解码,通过一些特殊的算法, 本程序还可以解开部分由于字节高位被屏蔽而形成的死乱码...
在IT领域,Base64是一种广泛使用的编码方式,主要用于将任意二进制数据转换成可打印的ASCII字符串,以便在不支持二进制传输的环境中(如电子邮件)进行传输。Base64编码遵循一个特定的规则,即将每3个字节(24位)的...
本篇将详细讲解如何将Base64编码的字符串转化为图片并保存到本地,以C#语言为例,结合.NET框架进行操作。 首先,我们需要理解Base64编码的基本原理。Base64编码是将每3个字节(24位)的数据分成4组,每组6位,然后...
Base64是一种编码机制,常用于在网络上传输二进制数据,因为许多协议(如电子邮件的MIME)只允许ASCII字符。在C/C++中,处理Base64编解码通常需要自定义函数或者利用开源库。这个开源库提供了解决这个问题的方法。 ...
本篇文章将详细探讨如何利用Base64编码和JSON对象来实现这个功能,特别是针对Java环境。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方法。它将每三个字节(24位)转换为四个ASCII字符(32位),因此...
Base64是一种网络上常见的数据编码方式,它将任意二进制数据转化为可打印的ASCII字符,以便在电子邮件等文本环境中传输。Base64编码基于64个字符的字符集,包括大小写字母、数字以及"+"和"/",并且通常在末尾添加一...
其中,`data:image/jpeg`指定了图片的MIME类型,`base64_encoded_string`是Base64编码后的图片内容。 5. **Utils文件**: 在提供的文件名列表中,`utils`可能是一个包含通用工具函数的模块,其中可能有一个用于...
Apache Commons Codec库除了基本的Base64编码,还提供了URL安全和MIME兼容的变种。 3. **Bouncy Castle库** Bouncy Castle是一个著名的开源密码学库,主要用于加密、签名和证书管理,但它也包含Base64编码器/解码...
在这个“base64V1.6_64位”压缩包中,包含的是一个64位版本的Base64解码工具——Base64V1.6.exe。这个工具主要用于帮助用户对已用Base64编码的数据进行解码,恢复其原始的二进制形式。 Base64编码的基本原理是将每3...