JavaMail邮件附件中文乱码问题
Java中文乱码的终极解决方案
Java中文乱码的终极解决方案1. 解决HTML页面中的中文问题为了使HTML页面很好地支持中文,就必须在每个HTML页面的头部增加如下代码:<HEAD><META http-equiv="Content-Type“ content="text/html; charset=UTF-8"></HEAD>2. 解决JSP页面中的中文问题为了使JSP页面很好地支持中文,就必须在每个JSP页面的头部增加如下代码:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>3. 解决HTTP(get/post)请求中的中文问题在默认情况下,IE浏览器发“ISO-8859-1”的编码格式发送请求,如果接收到HTTP的get请求中文参数时出现乱码,可以采用以下方法:1)对其进行Java编码转换,例如:String fieldName = new String(request.getParameter("fieldName").getBytes("ISO-8859-1"),"UTF-8");2) 通过设置Web服务器的编码来解决:a. Tomcat - 修改server.xml文件<Connector port="8080"...URIEncoding="UTF-8"/> <!--增加这项-->b. Resin - 修改resin.conf文件--Resin2.x<host id=''><character-encoding>UTF-8</character-encoding>...</host>--Resin3.x<web-app-default><character-encoding>UTF-8</character-encoding></web-app-default>4. 解决页面数据传输的中文问题为了使中文数据在各页面(组件)之间正常传递,最佳的方法就是采用编码过滤器来解决。
解析Java中文乱码的处理方法
解析Java中文乱码的处理方法【引自程序犹如人生的博客】为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。
汉语编程是怎么回事,我也不大清楚,应该是前年吧!我一朋友给我介绍汉语编程,怎么不错不错?当时因为学习忙没去关注这个,等我闲了,那个朋友不弄这个,问他,他也不说不大清楚,最后自己对这个学习也不了了之了。
我写这个不是讲解中英文之间的差距,解码等,我是将我在这几年工作遇到各种各样的乱码的解决方法,总结起来,也希望大家能把自己晕倒解决乱码的方法都说出来,咱们弄一个解决乱码的“葵花宝典”。
对于Java,由于默认的编码方式是UNICODE,所以用中文也易出问题,常见的解决是:1、utf8解决JSP中文乱码问题一般说来在每个页面的开始处,加入:◆charset=UTF-8的作用是指定JSP向客户端输出的编码方式为“UTF-8”;◆pageEncoding="UTF-8",为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效;◆request.setCharacterEncoding("UTF-8");是对请求进行了中文编码。
有时,这样仍不能解决问题,还需要这样处理一下:2、Tomcat 5.5中文乱码只要把%TOMCAT安装目录%/ webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFi lter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。
2)在你的web.xml里加入如下几行:3)完成2、get方式的解决办法1)打开tomcat的server.xml文件,找到区块,加入如下一行:完整的应如下:2)重启tomcat,一切OK。
Javamail 附件中文名字乱码祥解
现在研究javamail的人越来越多,现在我就谈谈在javamail中大家都会遇到的附件中文问题,由于sun的java的中文问题,导致当附件是中文时将出现乱码,导致程序异常,如何避免呢??我在学习javamail时采用如下方法首先对邮件体进行分析,首先判断邮件体是否有附件:Object out_content = message[i].getContent();if (!(out_content instanceof Multipart)){//不是复合邮件体,既是不带附件。
partname = new String[0];return partname;}如果是复合邮件体,那么就可以调用如下的方法取得中文文件名:public static String getISOFileName(Part body){//设置一个标志,判断文件名从Content-Disposition中获取还是从Content-Type中获取boolean flag=true;if(body==null){return null;}String[] cdis;try{cdis=body.getHeader("Content-Disposition");}catch(Exception e){return null;}if(cdis==null){flag=false;}if(!flag){try{cdis=body.getHeader("Content-Type");}catch(Exception e){return null;}}if(cdis==null){return null;}if(cdis[0]==null){return null;}//从Content-Disposition中获取文件名if(flag){int pos=cdis[0].indexOf("filename=");if(pos<0){return null;}//如果文件名带引号if(cdis[0].charAt(cdis[0].length()-1)=='"'){return cdis[0].substring(pos+10,cdis[0].length()-1);}return cdis[0].substring(pos+9,cdis[0].length());}else{int pos=cdis[0].indexOf("name=");if(pos<0){return null;}//如果文件名带引号if(cdis[0].charAt(cdis[0].length()-1)=='"'){return cdis[0].substring(pos+6,cdis[0].length()-1);}return cdis[0].substring(pos+5,cdis[0].length());}}但是有一种情况下,取得的中文文件名也是乱码,原因有的邮件服务器在发送邮件时,对附件名进行了特殊的编码,解决如上问题的方法如下:首先:1)用如上的方法取得中文文件名:String filename= new String(getISOFileName(part).getBytes("ISO-8859-1"),"gb2312");然后创建文件,如果发生FileNotFoundException异常,说明取得的文件名是经过特殊编码的--我们取得到的未解码的,是乱吗,那么就要用javamail提供的函数decodeText进行解码。
JAVA中文字符乱码解决详解
JAVA中⽂字符乱码解决详解⾸先要了解JAVA处理字符的原理。
JAVA使⽤UNICODE来存储字符数据,处理字符时通常有三个步骤:– 按指定的字符编码形式,从源输⼊流中读取字符数据– 以UNICODE编码形式将字符数据存储在内存中– 按指定的字符编码形式,将字符数据编码并写⼊⽬的输出流中。
所以JAVA处理字符时总是经过了两次编码转换,⼀次是从指定编码转换为UNICODE编码,⼀次是从UNICODE编码转换为指定编码。
如果在读⼊时⽤错误的形式解码字符,则内存存储的是错误的UNICODE字符。
⽽从最初⽂件中读出的字符数据,到最终在屏幕终端显⽰这些字符,期间经过了应⽤程序的多次转换。
如果中间某次字符处理,⽤错误的编码⽅式解码了从输⼊流读取的字符数据,或⽤错误的编码⽅式将字符写⼊输出流,则下⼀个字符数据的接收者就会编解码出错,从⽽导致最终显⽰乱码。
这⼀点,是我们分析字符编码问题以及解决问题的指导思想。
好,现在我们开始⼀只只的解决这些乱码怪兽。
⼀、在JAVA⽂件中硬编码中⽂字符,在eclipse中运⾏,控制台输出了乱码。
例如,我们在JAVA⽂件中写⼊以下代码:String text = “⼤家好”;System.out.println(text);如果我们是在eclipse⾥编译运⾏,可能看到的结果是类似这样的乱码:。
那么,这是为什么呢?我们先来看看整个字符的转换过程。
1. 在eclipse窗⼝中输⼊中⽂字符,并保存成UTF-8的JAVA⽂件。
这⾥发⽣了多次字符编码转换。
不过因为我们相信eclipse的正确性,所以我们不⽤分析其中的过程,只需要相信保存下的JAVA⽂件确实是UTF-8格式。
2. 在eclipse中编译运⾏此JAVA⽂件。
这⾥有必要详细分析⼀下编译和运⾏时的字符编码转换。
– 编译:我们⽤javac编译JAVA⽂件时,javac不会智能到猜出你所要编译的⽂件是什么编码类型的,所以它需要指定读取⽂件所⽤的编码类型。
Java中文乱码的解决方案
Java中文乱码的解决方案jsp+Servlet的形式,在jsp页面向后台发送的请求里包含中文时,后台采用String name = request.getParameter("name")接收到的是乱码,我在网上找了很多资料,有网友说request.getParameter是默认采用ISO8859-1来编码的,必须进行转换:我总结了一下,解决中文乱码大概有以下几种方式:1、采用decode()方法.URLDecoder.decode(s)2、采用设置字符集的方式request.setCharacterEncoding("utf-8");3、在页面上定义charset的字符集<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><meta http-equiv="Content-Type" content="text/html; charset=utf-8">4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8<filter><filter-name>encodingFilter</filter-name><filter-class>com.demo.filter.CoreFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>5、在form表单里定义编码accept-charset="utf-8" onsubmit="document.charset='utf-8';"6、更改ContentTypes的值改变myeclipse里ContentTypes的值为utf-87、改变tomcat字符集通过改变server.xml文件里的字符集来接收中文8、采用转码的方式nameCode = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");补充:如果是Servlet向页面发送的数据中包含中文,可以采用如下方式解决:response.setContentType("text/html;charset=utf-8");。
邮件乱码
造成邮件乱码的原因很多,但归纳起来不外乎有三种情况:一是操作系统和使用的软件设置不同导致的;二是发送邮件时发送程序采用不同的编码标准,如UU、MIME、BINHEX等,而你所用的操作系统程序没有能力将其解码,收到的邮件像“天书”一般;三是邮件传输邮局主机的原因,如有的主机(特别是国外的)不支持非ASCII码,将中文双字节或二进制格式邮件中每个字符的第八位过滤掉,使该信息与初始信息截然不同,造成邮件信息失真或损坏。
当你收到乱码邮件后,如果让对方重发一次,既浪费时间,又显得你“露怯”,不如通过尝试以下方法自行解码:1.根本设置对Outlook Express 进行根本设置,可彻底解决电子邮件的乱码。
打开Outlook Express 后,选择“工具”→“选项”命令,单击“阅读”标签,再单击“字体”按钮,选择“简体中文(GB2312)”,同时把它设置为默认值。
接下来,单击“国际设置”按钮,选中“为接收的所有的邮件使用默认的编码”,确定退出。
如此设置后,当你打开所有邮件,通常都不会再出现乱码了。
2.选项查看通常情况下,没有进行上述邮件设置,导致邮件乱码情况居多。
在Outlook Express中,选择乱码邮件后,单击“查看”→“编码”→“简体中文(GB2312)”或“其他”→“简体中文(HZ)”,邮件内容即可展现。
3.转寄再收如仍显示乱码,可试着将乱码邮件转寄到自己的邮箱中,然后用Outlook Express接收,有时即可顺利解码。
4.改名重读仍然不行可将邮件改名,存成一个后缀名为.eml的文件,由Outlook Express打开一般都可以自动解码。
5.追根溯源对于采用不同编码标准产生的乱码邮件,解码工作比较专业,说起来会很生涩。
我们不妨选择乱码邮件后,右键单击鼠标,在弹出的快捷菜单中选择“属性”命令,接着在出现的对话框中单击“详细资料”标签,再单击“邮件源文件”按钮,这时就会打开邮件源文件码,邮件内容显现。
为什么有时会收到乱码的电子邮件
为什么有时会收到乱码的电子邮件电子邮件是我们日常生活中不可或缺的一部分,它已经成为了我们最普遍的沟通方式之一。
在使用电子邮件时,我们可能会遇到各种各样的问题,其中之一就是收到了乱码邮件。
那么,为什么我们有时会收到乱码电子邮件呢?下面我们从几个方面来分析。
一、发件人使用的邮件客户端与我们不兼容电子邮件的发送和接收需要遵守一定的标准,这些标准和协议确保了待发送的邮件在各种不同的电子邮件系统之间能够无障碍地传递。
但是,不同的邮件客户端实现了不同的标准,有时候它们之间可能无法彼此兼容。
如果发件人使用的邮件客户端与我们不兼容,我们就有可能收到乱码邮件。
这是因为从发件人的电子邮件客户端发出的原始邮件被我们的客户端解读为乱码。
二、邮件内容设计不当邮件中包含了丰富的文本、图片、视频、音频等内容。
如果这些内容没有在邮件中嵌入或者以附件的形式添加,那么当我们收到这样的邮件时,我们的邮件客户端无法解读邮件中包含的内容,从而导致邮件出现乱码。
同时,如果发件人使用了一些非标准的字符集编码,也可能会导致我们收到乱码邮件。
三、传输过程中出现了问题电子邮件是通过一系列的服务器进行传递的,如果在传输过程中出现了问题,那么邮件可能会出现损坏、缺损或乱码等情况。
传输过程中可能会存在一些不稳定的因素,例如网络延迟、丢包等问题。
另外,邮件可能还会被黑客或垃圾邮件过滤器拦截、篡改或破坏,在这些情况下,我们也可能会收到乱码邮件。
四、系统或软件故障有时邮件客户端或操作系统本身存在一些故障或错误,导致邮件显示为乱码或不可读。
如果我们正在使用一个已知的有错误的邮件客户端或操作系统版本,那么这些错误可能会导致我们收到乱码邮件。
五、人为错误最后,我们也不能排除人为错误的可能性。
例如,如果我们没有正确设置邮件客户端的语言设置或字符集编码,那么我们就有可能收到乱码邮件。
同时,如果我们手动编辑邮件而没有正确使用字符集编码,那么我们的邮件也会出现乱码。
总结:在电子邮件的使用过程中,我们有可能会遇到收到乱码邮件的情况。
邮件乱码的种类
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
MIME编码错误所造成乱码的形式,比如邮件内容变为:
……
=A8=C3=A7@=A6=B9=B5=DF=AA=BA=A7=DC=A5 =CD=AF=C0=C3=C4=AA=AB=B7P=A8=FC=A9=CA=B8=D5 =C5=E7,=B1o=A8=EC=B3=CC=A6=B3=AE=C4=A7=ED=B5 =DF=A9=CE=B1=FE=B5=DF
PT09IA0K5Zyw44CA44CA5Z2A77ya5YyX5Lqs5biC5Lic5Z+O5Yy66byT5qW85aSW5aSn6KGXMjfl
------(Base 64传输编码格式)
原文地址:/Chinese/Help/20092/HelpMain5_Main5.html
------(Quoted-Printable传输编码格式)
或者是:
------
5bel56iL5biIOg0KICAgIOS9oOWlvSHpmYTku7bkuK3mmK/lrqLmiLflj43mmKDnu5nlkrHku6zk
vIHkuJrpgq7nrrHlj5Hkv6HlkI7lr7nmlrnpgq7nrrHmlLbliLDnmoTpgIDkv6Es6K+35biu5b+Z
默认语系不同所造成的乱码形式,比如邮件内容变为:
------
?耀耀鸅鸅耀 耀?鶳?耀耀鸅鸅耀耀?鶳 ??F¥[2`±z1i-O?H?A|i?IAOao?F﹐N!Aoo?U?A?H3]-p!i|
下载中文文件名乱码问题
下载中文文件名乱码问题原来处理下载的代码如下:response.setHeader("Content-Disposition", "attachment; filename=" + .URLEncoder.encode(fileName, "UTF-8"));下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。
一. 上面方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。
这是IE的bug,参见微软的知识库文章KB816868 。
原因可能是因为ie在处理Response Header 的时候,对header的长度限制在150字节左右。
而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。
微软提供了一个补丁。
这个补丁需要先安装ie6 sp1。
二. 我尝试使用javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成=?gb2312?B?xxxxxxxx?= 这样的形式,并从RFC1522 中找到对应的标准支持。
不过很遗憾,IE6并不支持这一个标准。
我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:response.setHeader( "Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"), "ISO8859-1" ) );在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。
如果台湾同胞用,把gb2312改成big5就行。
Javamail发送邮件主题(标题)乱码
Javamail发送邮件主题(标题)乱码最近开发遇到Javamail 发送邮件标题乱码问题,腾讯、⽹易邮箱不会乱码,阿⾥邮箱标题则会乱码。
解决办法:String subject = MimeUtility.encodeWord(mailEntity.getMailSubject(), "UTF-8", "Q");message.setSubject(subject);发送邮件代码:/*** 发送邮件可以带附件内容可为HTML** @param mailEntity* @return* @throws GeneralSecurityException*/public static boolean sendMail(MailEntity mailEntity)throws GeneralSecurityException {// 发件⼈电⼦邮箱final String from = mailEntity.getMailFromAddress();// 发件⼈电⼦邮箱密码final String pass = mailEntity.getMailFromPwd();// 指定发送邮件的主机为 String host = mailEntity.getMailFromHost(); // 邮件服务器String port = mailEntity.getPort();// 获取系统属性Properties properties = System.getProperties();// 设置邮件服务器properties.setProperty("mail.smtp.host", host);properties.setProperty("mail.smtp.port",port);properties.put("mail.smtp.auth", "true");MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable", "false");properties.put("mail.smtp.ssl.socketFactory", sf);// 获取默认session对象Session session = Session.getDefaultInstance(properties, new Authenticator() {public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三⽅登录授权码return new PasswordAuthentication(from, pass); // 发件⼈邮件⽤户名、密码}});try {// 创建默认的 MimeMessage 对象MimeMessage message = new MimeMessage(session);// Set From: 头部头字段message.setFrom(new InternetAddress(from));// Set To: 头部头字段message.addRecipient(Message.RecipientType.TO, new InternetAddress(mailEntity.getMailReceiverAddress()));// Set Subject: 主题⽂字String subject = MimeUtility.encodeWord(mailEntity.getMailSubject(), "UTF-8", "Q");message.setSubject(subject);// 创建消息部分BodyPart messageBodyPart = new MimeBodyPart();// 消息// messageBodyPart.setText(mailEntity.getMailContent());messageBodyPart.setContent(mailEntity.getMailContent(), "text/html;charset=utf-8");// 创建多重消息Multipart multipart = new MimeMultipart();// 设置⽂本消息部分multipart.addBodyPart(messageBodyPart);if (mailEntity.getFilePaths() != null && mailEntity.getFilePaths().size() > 0) {for (String filePath : mailEntity.getFilePaths()) {// 附件部分messageBodyPart = new MimeBodyPart();String suffix = "";String oldPath = "";if (filePath.indexOf(".") >0){suffix = filePath.substring(filePath.indexOf(".")+1);oldPath = filePath.substring(0,filePath.indexOf("."));DataSource source = new FileDataSource(oldPath);File file = ((FileDataSource) source).getFile();file.renameTo(new File(oldPath + "." + suffix));source = new FileDataSource(filePath);messageBodyPart.setDataHandler(new DataHandler(source)); }else {// 设置要发送附件的⽂件路径DataSource source = new FileDataSource(filePath);messageBodyPart.setDataHandler(new DataHandler(source)); }// 设置要发送附件的⽂件路径// messageBodyPart.setFileName(filename);// 处理附件名称中⽂(附带⽂件路径)乱码问题messageBodyPart.setFileName(MimeUtility.encodeText(filePath)); multipart.addBodyPart(messageBodyPart);}}// 发送完整消息message.setContent(multipart);// 发送消息Transport.send(message);("Sent mail successfully....");return true;} catch (MessagingException e) {logger.debug(e.getMessage());} catch (UnsupportedEncodingException e) {logger.debug(e.getMessage());}return false;}实体:/*** @Auther: mxf* @Date: 2018/10/31 16:08* @Description:发送邮件实体类*/public class MailEntity implements Serializable {/*** 邮件接收地址*/private String mailReceiverAddress;/*** 邮件主题*/private String mailSubject;/*** 邮件内容*/private String mailContent;/*** 附件路径*/private List<String> filePaths = new ArrayList<String>();/*** 发送地址*/private String mailFromAddress;/*** 发送者的邮件密码*/private String mailFromPwd;/*** 指定发送邮件的主机*/private String mailFromHost;/*** 发送邮件主机端⼝*/private String port;public String getPort() {return port;}public void setPort(String port) {this.port = port;}public String getMailReceiverAddress() {return mailReceiverAddress;}public void setMailReceiverAddress(String mailReceiverAddress) { this.mailReceiverAddress = mailReceiverAddress;}public String getMailSubject() {return mailSubject;}public void setMailSubject(String mailSubject) {this.mailSubject = mailSubject;}public String getMailContent() {return mailContent;}public void setMailContent(String mailContent) {this.mailContent = mailContent;}public List<String> getFilePaths() {return filePaths;}public void setFilePaths(List<String> filePaths) {this.filePaths = filePaths;}public String getMailFromAddress() {return mailFromAddress;}public void setMailFromAddress(String mailFromAddress) {this.mailFromAddress = mailFromAddress;}public String getMailFromPwd() {return mailFromPwd;}public void setMailFromPwd(String mailFromPwd) {this.mailFromPwd = mailFromPwd;}public String getMailFromHost() {return mailFromHost;}public void setMailFromHost(String mailFromHost) {this.mailFromHost = mailFromHost;}}。
Java Web项目开发中的中文乱码问题与对策
Java Web项目开发中的中文乱码问题与对策在Java Web项目开发中,中文乱码问题是一个常见的挑战。
当我们接收、处理和展示中文数据时,如果不正确地处理字符编码,就可能导致中文乱码的问题。
下面是一些常见的中文乱码问题及其对策。
1. 请求参数中的中文乱码:当浏览器发送一个带有中文参数的请求时,服务器端可能无法正确解析中文字符。
解决方案是在服务器端对请求参数进行解码。
可以通过在Tomcat的server.xml中配置URIEncoding属性来确保正确的解码,例如将URIEncoding 设为"UTF-8"。
2. 数据库中的中文乱码:当我们将中文数据存储到数据库中时,如果数据库的字符编码与传入的数据的字符编码不一致,就会出现中文乱码。
解决方案是在创建数据库表时指定正确的字符编码,并在连接数据库时设置正确的连接字符编码。
可以在创建数据库表时指定字符集为utf8mb4,然后在连接MySQL数据库时将连接字符集设为utf8mb4。
3. 页面展示中的中文乱码:在JSP页面中,如果不指定正确的字符编码,就可能出现中文乱码。
解决方案是在JSP页面的头部指定正确的字符编码,例如设置contentType为"text/html; charset=UTF-8"。
4. 中文文件名的乱码:当我们下载一个中文文件时,浏览器可能无法正确解析中文文件名,导致乱码。
解决方案是通过在响应的header中设置Content-Disposition属性来指定正确的文件名编码。
可以将Content-Disposition的值设置为"attachment; filename*=utf-8''文件名",其中文件名是经过URL编码的。
6. 处理中文乱码的过滤器:为了统一处理中文乱码问题,可以在项目中添加一个字符编码过滤器,将所有的请求和响应的字符编码都统一为UTF-8。
邮件乱码破解完全手册
邮件乱码破解完全手册随着Internet的普及,在网上通过E-mail传递信息逐渐成为现代人生活的时尚,相信不久甚至还会成为一种生活的必需内容。
但我们在接收电子邮件的时候,不时会发现接收的邮件是些怪模怪样的乱码,根本无法阅读。
如果这些邮件的内容并不很重要,可能还不会有太大影响,可是假如是些紧急事件的通知或是生意场上的公函,则很可能就会给你带来不小的损失。
遇到这种情况,你打算怎么办呢?把邮件丢进垃圾筒就当没收到,麻烦发信人再重发一次,还是自己找方法破译?我们知道,计算机以及很多计算机网络协议的制定都是建立在ASCII码(美国国家标准信息交换码,它是一种最基本的字符表示方法)基础上的,但是随着信息内容的日益丰富,用ASCII码表示计算机信息开始暴露出很大的不足,这主要表现在表示多国文字、图形、声音等二进制文件和信息压缩、信息保密等诸多方面。
因此,在ASCII码和扩展ASCII码的基础上,用一定的规则定义一些新的信息表达形式就形成了信息传输和处理中的另一类概念和事物,这就是“编码”和“解码”。
当信息编码和解码能够统一的时候,信息无疑是可以交换和被理解的;反之,当信息编码和解码不能够得到统一的时候,信息就无法被用于交换和理解,于是就产生了所谓的“乱码”。
既然乱码的产生是由于信息编码和解码不能够得到统一,那么解决乱码的过程自然就是找到和编码相统一的解码方法,并对计算机软件不能全自动进行正确解码的信息进行重新处理和解码,最终使得所恢复的信息能被人们理解和交换,这就是所谓的“破解”。
可以说,常见的乱码都有这样一些共性:(1)和汉字或其他语种的文字有关;(2)最常发生在电子邮件的传输和阅读中;(3)和传送二进制文件有关;(4)和信息加密解密、编码解码有关。
而我们今天要讨论的电子邮件乱码的原因也正如前面所说,和相应的邮件发送系统、电子邮件软件以及操作系统平台本身,即它们用来自动识别和编码解码的协议规则,有着极为密切的关系。
如何解决Java中中文乱码问题
如何解决Java中的中文乱码问题?一、中文问题的来源计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。
随着计算机的开展,为了适应世界其它民族的语言〔当然包括我们的汉字〕,人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统〔多数时间是操作系统〕默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。
Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。
我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。
所以,大局部的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。
如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312根底上扩充来的。
1由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,那么显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。
同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行〔我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行〕。
javamail乱码问题
JavaMail的乱码问题今天需要用javamail自动发邮件,结果测试结果一看,发现邮件发是发出去了,就是有一大堆的乱码,这是郁闷上网查了下,其实就是多设置一个小地方就可以咯,呵呵看来自己功夫还不到家哦,要多多练习package email;import java.io.File;import java.io.FileNotFoundException;import java.util.Properties;import java.util.Scanner;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;public class MailSender {private static Properties pro = new Properties();static {pro.put("mail.transport.protocol", "smtp");pro.put("mail.smtp.auth", "true");pro.put("mail.smtp.host", "");pro.put("mail.host", "");}public MailSender() {super();// TODO Auto-generated constructor stub}public static void sendWelcomeMail(String to) {try {DyeracAuthenticator authen = new DyeracAuthenticator();Session session = Session.getInstance(pro, authen);Message msg = new MimeMessage(session);msg.setFrom(new InternetAddress("opencampus@"));msg.setSubject("欢迎注册open-campus开源平台");msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));File mail=new File("mail.txt");StringBuffer buf=new StringBuffer();try {Scanner s=new Scanner(mail);while(s.hasNextLine()){buf.append(s.nextLine());}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(buf.length()<1)buf.append("no text");msg.setContent(buf.toString(),"text/html;charset=utf8");System.err.println(buf.toString());Transport.send(msg);} catch (AddressException ae) {// TODO Auto-generated catch blockae.printStackTrace();} catch (MessagingException me) {me.printStackTrace();}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubMailSender.sendWelcomeMail("dyerac@");}}要设置的地方就是msg.setContent(buf.toString(),"text/html;charset=utf8");必须设置一个字符集,不然估计对方就会按默认的us-ascii来处理了吧为了不浪费我在网上的搜索结果,我把别人写的也转在后面:可能显得比较凌乱,sorry咯LIST:JavaMail API简介JavaMail 之杜绝邮件乱码JavaMailAPI及其应用——一个邮件列表服务器的实现JavaMail操作的总结JavaMail的标题的中文问题最新版已经解决JavaMail访问Hotmail邮箱Javamail中的常见中文乱码问题与解决办法使用javamail发送html邮件--------------------------------------------------------------------------------------------------javamai原文:javamaiJavaMail API简介JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。
邮件乱码的主要原因及解决方法
将Uuencode“乱码”邮件转寄到自己的邮箱中,再使用能够支持UU解码的电子邮件接收程序(如Eudora、OutLook Express等)来接收该邮件。
通过剪贴板将Uuencode“乱码”存入文本文件,改文件名后缀为UUE,然后使用Winzip解码。 将Uuencode“乱码”存入一个文件,然后在DOS下用uudecode.exe程序将文件解码。
将Base64 encode“乱码”邮件存成一个文本文件,改文件名后缀为.UUE,然后使用 Winzip 解码。 将Base64 encode“乱码”邮件存成一个文件,
将文件后缀改为.EML,由OutLook Express 打开,就可以自动解码。
3.QP-encode“乱码”
采用QP编码方式的邮件很容易进行判别,因为它的内容通常有很多等号“=”,因此不需要看“信头”也可以判断是否为QP编码。 如果你的电子邮件接收程序不支持QP解码,
那么你看到的就是这些QP-encode“乱码”。 解决QP-encode“乱码”的办法: 将QP-encode“乱码”邮件转寄到自己的邮箱中,然后用支持QP解码的电子邮件接收程序
将 Uuencode“乱码”存入一个文件,然后在Windows下用Wincode解码。 Wincode除支持UU编码外也支持MIME、Binhex等编码格式,应用范围颇为广泛。
2.Base64 encode“乱码”
Base64是MIME标准编码之一。Base64 encode编码方式是将3个字节(8位)用4个字节(6位)表示,由于编码后的内容是6位的,因此可以避免第8位被截掉。Base64 encode“乱码”大体格式为:
解决JavaMail附件名字过长导致的乱码问题
解决JavaMail附件名字过长导致的乱码问题问题背景:公司有个业务场景是审核客户机构通过后,给客户发送⼀封邮件,并将机构相关材料以附件形式⼀块发送,有些附件名正常,有些就乱了,如下图:后来发现是附近名称过长导致的!问题原因:java mail中设置附件名称会采⽤ base64格式进⾏编码,如果附件名称过长会被进⾏切割,将剩下字符抹去,所以导致不知道这是什么格式的⽂件。
注:虽然将⽂件格式被改变了,但是若强制转换成原格式(右键->另存为->xxx.pdf)仍然可以进⾏打开,⽂件内容也并⾮改变(这是测试后的结果)解决⽅案:由于是spring boot 项⽬,只需要在main⽅法中加⼊以下代码即可(⼤概意思就是,取消切割,默认是true)System.setProperty("mail.mime.splitlongparameters", "false");补充知识:LinkedList的增删⼀定⽐ArrayList快吗?1.背景众所周知,arrayList底层是通过数组实现,当其超过容量时,会进⾏1.5的扩容,将原数组数据迁移⾄新数组中。
⽽LinkedList底层为双向链表,其增加操作直接在尾部新增⼀个node节点即可。
那么,在插⼊相同的数据情况下(集合默认长度都是0),到底谁更快呢?2.案例public static void main(String[] args) {List<String> array = new ArrayList<>();List<String> linked = new LinkedList<>();long start = System.currentTimeMillis();int index = 10000000;for (int i = 0; i < index; i++) {array.add("" + i);}long end = System.currentTimeMillis();System.out.println("ArrayList⽤时:" + (end - start) / 1000 + "s");start = System.currentTimeMillis();for (int i = 0; i < index; i++) {linked.add("" + i);}end = System.currentTimeMillis();System.out.println("LinkedList⽤时:" + (end - start) / 1000 + "s");}3.结果4.分析此处我是这么理解的,arrayList是通过下标直接去放⼊数据,⽽linked需要创建⼀个Node然后将数据放⼊,再与前节点建⽴链接。
电子邮件“乱码”现象解析及处理txt
电子邮件“乱码”现象解析及处理收到远方客户的电子邮件,当然是一件令人高兴的事,但当你满怀欣喜地打开的时候,面对的却是一堆乱码,扫兴之余更是着急。
想必这样的情形每一个上网的用户都曾遇到过。
的确,电子邮件的乱码问题是困扰中文电子邮件用户一件头疼的事,但并非每个用户都知道如何解决这个问题。
下面笔者就从三个方面对E-mail乱码问题进行一下探讨,同时提出具体的解决办法。
电子邮件软件常用的编码方式及判别方法要解决电子邮件乱码的问题,我们很有必要了解一下电子邮件是如何进行编码的,以便可以“对症下药”,尽快解决问题。
我们知道,由于历史原因,E-mail 只允许传送字符,而且是7位字符的E-mail 网关时,毫无疑问地会出现问题。
这些7位的E-mail 网关把汉字内码第8位的1全部变成了0,于是形成了一些不可读的文字。
好在现在越来越多的E-mail 网关已能处理8位字符,国内更是如此。
所以,直接传送中文问题不大,但是要和国外的朋友通信就另当别论了,本文后面详述。
为了解决E-mail 传输8位字符以及二进制文件的问题,出现了各种各样的编码方式,概括地说,可分为对E-mail 正文的编码和对E-mail 附带文件的编码两类。
对E-mail 正文的编码有Usenet 上专门针对中文的HZ 码等,对E-mail 附带文件的编码则有UUENCODE,BINBEX 等。
而在Internet 上标准的编码方式却是MIME(Multi -purpose Internet Mail Exten—sions 多用途Internet 邮件扩展),它对E-mail 传送多媒体信息(诸如声音、图像、二进制文件等)进行了一系列详细而复杂的定义,包括了对E-mail 正文的编码和对E-mail 的附带文件的编码。
现在绝大多数的电子邮件软件如ENDORA、Foxmail、THE-BAT!等都支持MIME 编码方式。
纯中文方式编码:这就是我们通常看到的一般文本,没有经过任何编码,任何软件都能准确识别,因而不会出现任何乱码(在指定了正确的字符集后)。
JAVA中文乱码问题的分析与解决方案_刘瑞玲
JAVA中文乱码问题的分析与解决方案刘瑞玲1 苟浩锋2 杜叔强1(1.兰州工业高等专科学校软件工程系甘肃兰州730050;2.兰州市气象局甘肃兰州730020)摘要:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。
原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
关键词:Java;中文乱码问题中图分类号:[O244] 文献标识码:A 文章编号:1000-9795(2012)03-0403-01 一、引言Java中文问题一直困扰着很多初学者,如果了解了Java系统的中文问题原理,我们就可以对中文问题能够采取根本的解决之道。
Java总是根据操作系统的默认编码字符集来决定字符串的初始编码,而且Java系统的输入和输出的都是采取操作系统的默认编码。
因此,如果能统一Java系统的输入、输出和操作系统三者的编码字符集合,将能够使Java系统正确处理和显示汉字。
二、中文乱码的由来首先,Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。
基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ pagecontentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。
本文要重点讨论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JavaMail附件中文名称乱码
问题: 用Javamail发邮件到邮件服务器,从邮箱中查看发现附件的中文名称变成了密码原因:不明
解决:在设置邮件附件的时候调用javax.mail.internet.MimeUtility来编码, 例如
MimeMessagemsg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = { new InternetAddress(to) };
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
// create and fill the first message part
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(msgText1);
// create the second message part
MimeBodyPart mbp2 = new MimeBodyPart();
// attach the file to the message
mbp2.attachFile(filePath);
mbp2.setFileName(MimeUtility.encodeWord(fileName));
// create the Multipart and add its parts to it
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
// add the Multipart to the message
msg.setContent(mp);
// set the Date: header
msg.setSentDate(new Date());
/*
* If you want to control the Content-Transfer-Encoding of the
* attached file, do the following. Normally you should never need
* to do this.
*
* msg.saveChanges(); mbp2.setHeader("Content-Transfer-Encoding",
* "base64");
*/
// send the message Transport.send(msg);。