`
jackyclein
  • 浏览: 9086 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

解析MIME 包中base64文本 之 费解篇

阅读更多
乱码问题,是对中文系统的一个挑战,只要你在中文环境下做开发,如果没有遇到乱码,那是你的福份,应该谢天谢地。

近些天做了一个小应用,用来解析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

    MIME-Base64-3.01.tar.gz

    MIME-Base64.rar_MIME base64 _base64_mime

    Base64是MIME邮件中常用的编码方式之一。它的主要思想是将输入的字符串或数据编码成只含有{ A - Z , a - z , 0 - 9 , + , / }这64个可打印字符的串,故称为“Base64”。

    电子邮件MIME协议中的Base64编解码

    Base64编解码是MIME协议中的一种常用的编码方式,用于将二进制数据转换为文本数据,以便在电子邮件中传输。下面是 Base64 编解码的知识点: 1. 什么是Base64编解码? Base64编解码是一种编码方式,用于将二进制...

    perl-MIME-Base64-3.15-396.el8.aarch64.rpm

    离线安装包,亲测可用

    Base64文件图片编码解码双向转换解析预览工具

    总结来说,"Base64文件图片编码解码双向转换解析预览工具"是一款实用的应用,涵盖了Base64编码与解码的核心功能,特别适合于处理图片和文件的在线转换,而且其预览和暗色背景设计考虑了用户体验,使得处理透明图片...

    perl-MIME-Base64-3.15-396.el8.x86_64.rpm

    离线安装包,亲测可用

    BASE64Decoder jar包

    虽然`sun.misc`包中的这些类不推荐在新代码中使用,但Java 8引入了`java.util.Base64`类,它提供了正式支持的BASE64编码和解码功能。`Base64`类提供了更稳定、更健壮且功能丰富的接口,包括对URL和MIME类型的编码...

    Thymeleaf显示base64字符串为图片.docx

    在网页开发中,有时我们需要将Base64编码的字符串直接作为图片显示出来,这在Thymeleaf框架中可以通过特定的方式实现。Base64是一种数据编码方式,它将二进制...这样,浏览器就能正确地解析和显示Base64编码的图片。

    BASE64Encoder.jar

    这是因为Base64能够将任何二进制数据转化为纯文本形式,便于在网络传输中不被错误地解析或损坏。 Base64的基本原理是将每3个8位字节(24位)的数据转换为4个6位字节(24位)的数据,然后在每个6位字节前添加两个...

    base64加密jar包

    Base64是一种编码方式,常用于在网络上传输二进制数据,因为许多协议(如电子邮件的MIME)只允许ASCII字符。在这个“base64加密jar包”中,包含了一个名为`sun.misc.BASE64Decoder.jar`的文件,它是Java的一个内置...

    BASE64编码

    Base64编码是一种广泛使用的数据编码方式,尤其在互联网通信和文本存储中扮演着重要角色。它将任意可打印字符转换成一个特定的64字符集合的表示形式,以确保数据在传输过程中不受字符集限制,同时保持文本的不可读性...

    乱码查看器乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64

    乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64, Quoted-Printable,HZ和UUCode四种形式的编码和解码,通过一些特殊的算法, 本程序还可以解开部分由于字节高位被屏蔽而形成的死乱码...

    base64包,decodeBase64包,encodeBase64String包

    在IT领域,Base64是一种广泛使用的编码方式,主要用于将任意二进制数据转换成可打印的ASCII字符串,以便在不支持二进制传输的环境中(如电子邮件)进行传输。Base64编码遵循一个特定的规则,即将每3个字节(24位)的...

    base64转化为图片保存到本地

    本篇将详细讲解如何将Base64编码的字符串转化为图片并保存到本地,以C#语言为例,结合.NET框架进行操作。 首先,我们需要理解Base64编码的基本原理。Base64编码是将每3个字节(24位)的数据分成4组,每组6位,然后...

    C/C++ Base64编解码开源库

    Base64是一种编码机制,常用于在网络上传输二进制数据,因为许多协议(如电子邮件的MIME)只允许ASCII字符。在C/C++中,处理Base64编解码通常需要自定义函数或者利用开源库。这个开源库提供了解决这个问题的方法。 ...

    Base64+JSON实现图片下载

    本篇文章将详细探讨如何利用Base64编码和JSON对象来实现这个功能,特别是针对Java环境。 Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方法。它将每三个字节(24位)转换为四个ASCII字符(32位),因此...

    base64编解码C/C++实现

    Base64是一种网络上常见的数据编码方式,它将任意二进制数据转化为可打印的ASCII字符,以便在电子邮件等文本环境中传输。Base64编码基于64个字符的字符集,包括大小写字母、数字以及"+"和"/",并且通常在末尾添加一...

    图片转base64保存到数据库 , 并回显到浏览器

    其中,`data:image/jpeg`指定了图片的MIME类型,`base64_encoded_string`是Base64编码后的图片内容。 5. **Utils文件**: 在提供的文件名列表中,`utils`可能是一个包含通用工具函数的模块,其中可能有一个用于...

    base64用到的jar包下载

    Apache Commons Codec库除了基本的Base64编码,还提供了URL安全和MIME兼容的变种。 3. **Bouncy Castle库** Bouncy Castle是一个著名的开源密码学库,主要用于加密、签名和证书管理,但它也包含Base64编码器/解码...

    base64V1.6_64位

    在这个“base64V1.6_64位”压缩包中,包含的是一个64位版本的Base64解码工具——Base64V1.6.exe。这个工具主要用于帮助用户对已用Base64编码的数据进行解码,恢复其原始的二进制形式。 Base64编码的基本原理是将每3...

Global site tag (gtag.js) - Google Analytics