-
Java乱码总结
2019-03-12 14:10:06昨天项目遇到了乱码问题,在自己电脑上是没问题的然而在服务器上就出现的乱码的问题,所以就以乱码为点来仔细的了解一下Java中的乱码。 先简单了解一下java的字符串的编码到存储的过程: java在字符串中统一用...昨天项目遇到了乱码问题,在自己电脑上是没问题的然而在服务器上就出现的乱码的问题,所以就以乱码为点来仔细的了解一下Java中的乱码。
先简单了解一下java的字符串的编码到存储的过程:
java在字符串中统一用Unicode表示。
对于任意一个字符串:String string = “测试字符串”;
如果源文件是GBK编码,操作系统默认环境编码也为GBK,那么编译的时候,JVM将按照GBK编码将字节数组解析为字符,然后将字符转换为Unicode格式的字节数组,作为内部存储(字节数组→字符→Unicode字节数组)。当打印这个字符串时,JVM根据操作系统本地的语言环境,将Unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。
当源码文件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 … , 编译时,JVM按照utf-8 解析成字符,然后转换为unicode格式的字节数组, 那么不论源码文件是什么格式,同样的字符串,最后得到的unicode字节数组是完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关)
一、Java常见的编码方式
-
ASCII码:众所周知,这是最简单的编码。它总共可以表示128个字符,0~31是控制字符如换行、回车、删除等,32~126是打印字符,可以通过键盘输入并且能够显示出来的。
-
ISO-8859-1:它是基于ASCII码基础上扩展的,它总共能表示256个字符,涵盖了大多数西欧语言字符。详见 ISO-8859-1 编码 该编码不支持中文,举个中文编码栗子 :字符串“I am 君山”用 ISO-8859-1 编码,下面是编码结果
由于ISO-8859-1 是单字节编码且不支持中文,直接将中文字符转成‘3f’, 3f也就是常见的"?"字符
-
GB2312: 它是双字节编码,共包含6763个汉字。
-
GBK:汉字内码扩展规范,是基于GB2312上拓展的,加入了更多的汉字,能表示21003个汉字。它的编码是和GB2312兼容的。也就是说用GB2312编码的汉字可以用GBK来解码,并且不会乱码。倒过来就不完全可以了,因为GB2312描述的汉字比GBK少。
-
UTF-16:UTF-16是基于Unicode上定义的, 用两个字节来表示Unicode的转换格式,它采用定长的表示方法,即不能什么字符都可以用两个字节表示。两个字节是16个bit,所以就做UTF-16。(Unicode 囊括了世界上所有语言,所有语言均可通过Unicode来相互翻译,详解 Unicode 编码)
-
UTF-8:由于UTF-16统一采用两个字节来表示一个字符, 有很多字符用一个字节表示即可。所以存储空间放大了一倍,还会增加网络传输的流量,所以推出了UTF-8。 UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。
二、常见乱码问题分析
乱码指的是程序显示出来的字符文本无法用任何语言去解读。一般情况下会包含大量的?。本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。
- 中文变成看不懂的字符:如果一串中文字符变成了一串看不懂的字符如:"Ì Ô £ ¡Î Ò Ï²»¶ £ ¡",这种情况通常是编码字符集与解码时所用的字符集不一致所造成的。比如使用GBK编码,如果使用ISO-8859-1解码的话结果就是这样。
- 一个汉字变成了一个问号:如果编码和解码的字符集都是一致的,那么可以确定该字符编码不支持中文,例如:ISO-8859-1
- 一个汉字变成了两个问号:中文经过多次编码且其中有一次编码或者解码使用了不支持中文的字符集
三、常见案例分析
参数传输乱码
背景:从jsp中传参数(包括中文)请求后台数据,在后台获取到的请求参数乱码。
1、前端编码设置,先讲解下jsp中编码的配置:
a、其中contentType中charset用来设置服务器发送给客户端时的内容编码;pageEncoding 用来设置JSP源文件本身和响应正文中的字符编码。通俗的说pageEncoding是jsp文件本身的编码,如果pageEncoding设置为ISO-8859-1,则jsp页面中不能保存中文字符,会自动提示你是否要设置为UTF-8.
b、jsp文件编码字符集默认为ISO-8859-1, JSP源文件字符集时,优先级为pageEncoding>contentType。如果都没有设置,默认ISO-8859-1。
c、设置响应输出的字符集时,优先级为contentType>pageEncoding。如果都没有设置,默认ISO-8859-1。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 综上所述,解决该问题乱码的第一步要设置jsp中的编码,最好统一为UTF-8。 exmaple(乱码示例):
页面效果如下:
2、后端编码设置
首先要设置tomcat编码,其中要了解两个参数(conf/server.xml):URIEncoding和useBodyEncodingForURI,可以查看官方文档说明http://tomcat.apache.org/tomcat-7.0-doc/config/http.html, 以下是我理解:
-
URIEncoding是对所有GET方式的请求的数据进行统一的重新编码,默认编码 ISO-8859-1(针对URI上的请求参数)
-
useBodyEncodingForURI:此设置仅适用于请求的查询字符串(针对请求体中内容)。 与URIEncoding不同,它不影响请求URI的路径部分。如果不知道请求字符编码(浏览器不提供,并且SetCharacterEncodingFilter不设置或使用Request.setCharacterEncoding方法的类似过滤器),默认编码始终为“ISO-8859-1”。URIEncoding设置对此默认值没有影响。该参数为false。通俗的说:true表示get和post的编码保持一致,post方式的编码是什么,get方式的编码就是什么。false表示get和post的字符编码各自设置,互相没有关系。
-
example1(只设置URIEncoding):
server.xml:
<Connector connectionTimeout="20000" port="9080" protocol="HTTP/1.1" redirectPort="443" URIEncoding="UTF-8" />
controller:
@RequestMapping(value = "/testURI", method=RequestMethod.POST) @ResponseBody public String testURI(HttpServletRequest request){ String username = request.getParameter("username"); String nickname = request.getParameter("nickname"); System.out.println("姓名:" + username + ", 昵称:" + nickname); return "姓名:" + username + ", 性别:" + nickname; }
jsp:
<form action="${pageContext.request.contextPath }/testURI.html?username=张三" method="post"> <input type="text" name="nickname" value="老张三"/> <input type="submit" value="提交"/> </form>
输出结果: 姓名:张三, 昵称:èå¼ ä¸
从结果中可以看出, URIEncoding只对URI中的参数进行编码。
- example2:只修改controller中代码,就都会显示正常
@RequestMapping(value = "/testURI", method=RequestMethod.POST) @ResponseBody public String testURI(HttpServletRequest request) throws UnsupportedEncodingException{ request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String nickname = request.getParameter("nickname"); System.out.println("姓名:" + username + ", 昵称:" + nickname); return "姓名:" + username + ", 性别:" + nickname; }
其实第二种做法并不是很方便,一般通过设置URIEncoding+encodingFilter即可解决。
- example3(通常做法):
web.xml代码如下,其余跟example1一样即可。
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- example4:
@RequestMapping(value = "/testURI", method=RequestMethod.POST) @ResponseBody public String testURI(HttpServletRequest request) throws UnsupportedEncodingException{ request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String nickname = request.getParameter("nickname"); System.out.println("姓名:" + username + ", 昵称:" + nickname); return "姓名:" + username + ", 性别:" + nickname; }
如果只设置URIEncoding=ISO-8859-1,request.setCharacterEncoding("UTF-8");只会对请求体中的参数进行编码,所以username是乱码的。
- example5: 在example4的基础上设置useBodyEncodingForURI="true",设置useBodyEncodingForURI=true时,就会将请求参数和请求体中的参数根据request.setCharacterEncoding或者contentType中的字符集编码。
- request乱码:
- POST请求:request.setCharacterEncoding();--->只对post请求有效。
- GET请求:
问题本质是get方式传递的参数内容默认编码方式问ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也无法解决问题
法一:要解决这个问题,修改tomcat服务器的配置文件。修改tomcat目录下的conf/server.xml文件也就是上面example1所说的设置URIEncoding
法二:下文的 new String(s.getBytes(“iso-8859-1”) ,”UTF-8”);
- response乱码:
法一:response.setCharacterEncoding("UTF-8"); 目的是用于response.getWriter()输出的字符流的乱码问题。如果是response.getOutputStream()是不需要此种解决方案的,因为这句话的意思是为了将response对象中的数据以UTF-8解码后的字节流发向浏览器;
法二:response.setContentType("text/html;charset=utf-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;
response.setHeader("content-type","text/html;charset=UTF-8");告诉浏览器用utf-8解析(setHeader是HttpServletResponse的方法。如果想在拦截器Filter中设置字符编码,则无此方法,因为Filter的doFilter方法的参数类型是ServletResponse)
四、终极武器即通过平台默认字符集进行编码getBytes()
new String(s.getBytes(“iso-8859-1”) ,”UTF-8”);
new String(s.getBytes(“iso-8859-1”) ,”GBK”)
- GBK<----->UTF-8
先来看几个例子:
例如:String str = “java乱码问题”; //错误,因为getBytes()默认使用GBK编码, 而解析时使用UTF-8编码,肯定出错。 System.out.println( new String(str.getBytes(),"UTF-8")); //错误,因为getBytes 的编码与 UTF-8 不一致,肯定是乱码 System.out.println( new String( s.getBytes("GBK") , "UTF-8)); //结果都是正确的,因为它们的源内容编码和解析用的编码是一致 System.out.println( new String(s.getBytes(),"GBK")); System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));
其中getBytes()是将Unicode转换为操作系统默认格式的字节数组,即“java乱码问题”的GBK格式,new String (bytes, Charset) 中的charset 是指定读取byte的方式,这里指定为UTF-8,即把bytes的内容当做UTF-8来读取。
原理:利用getBytes将unicode字符串转成UTF-8格式的字节数组,然后用utf-8 对这个字节数组解码成新的字符串,转GBK也是 同理。
//GBK转UTF-8 new String( s.getBytes("utf-8") , "utf-8"); UTF-8 转GBK new String( s.getBytes("GBK") , "GBK");
其实核心工作都由getBytes(charset)做了。getBytes的JDK描述:Encoding this String into a sequence of bytes using the named charset,storing the result into a new byte array.
OutputStreamWriter w1 = new OutputStreamWriter(new FileOutputStream("D:\\file1.txt"),"UTF-8"); InputStreamReader( stream, charset)
可以帮助我们轻松的按照指定编码读写文件。
- 为什么在tomcat 下使用new String(s.getBytes(“iso-8859-1”) ,”GBK”)可以呢?
tomcat 默认使用iso-8859-1编码, 也就是说,如果原本字符串是GBK的,tomcat传输过程中,将GBK转成iso-8859-1了,默认情况下,使用iso-8859-1读取中文肯定是有问题的,那么我们需要将iso-8859-1 再转成GBK, 而iso-8859-1 是单字节编码的,即他认为一个字节是一个字符, 那么这种转换不会对原来的字节数组做任何改变,因为字节数组本来就是由单个字节组成的,如果之前用GBK编码,那么转成iso-8859-1后编码内容完全没变, 则 s.getBytes(“iso-8859-1”) 实际上还是原来GBK的编码内容则 new String(s.getBytes(“iso-8859-1”) ,”GBK”) 就可以正确解码了。 所以说这是一种巧合。
-
-
Java 乱码根本原因
2013-12-20 10:10:01原文地址:Java 乱码根本原因 Java 乱码根本原因 解决方法网上很多·但是一直找不到根本原因。 根本原因就是:java可以设置字符编码的地方太多,只要有不统一的地方就有出现乱码。 ------------...原文地址:Java 乱码根本原因
Java 乱码根本原因解决方法网上很多·但是一直找不到根本原因。
根本原因就是:java可以设置字符编码的地方太多,只要有不统一的地方就有出现乱码。
----------------------------------------------------------------------------------------------------------------------------------
*************************************java、jsp中设置编码******************************************/
首先说在java里那些地方能够设置编码
开发工具会有好多地方设置编码这个不解少了,这里不介绍了。
下面两种设置编码格式方法适用于jsp页面(*.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page contentType="text/html; charset=UTF-8" %>
下面方式适合于jsp、servlet、action中(*.java)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
下面适合html页面(*.htm;*.html)
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Tomcate设置编码(server.xml)
<Connector 其他省略 port="80" URIEncoding="UTF-8">
mysql设置编码命令
SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;
SET character_set_server = utf8;
SET collation_connection = utf8_bin;
SET collation_database = utf8_bin;
SET collation_server = utf8_bin;
my.ini中配置默认编码
default-character-set=utf8
连接数据库设置编码
jdbc:mysql://192.168.0.5:3306/test?characterEncoding=utf8
java中的常用编码UTF-8;GBK;GB2312;ISO-8859-1;
对应mysql数据库中的编码utf8;gbk;gb2312;latin1
//过滤器设置编码过滤(SetCharacterEncodingFilter.java)
package com.sorc;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SetCharacterEncodingFilter extends HttpServlet implements Filter{
private FilterConfig filterConfig;
private String encoding=null;
//Handle the passed-in FilterConfig
public void init(FilterConfig filterConfig){
this.filterConfig=filterConfig;
encoding=filterConfig.getInitParameter("encoding");
}
//Process the request/response pair
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain){
try{
request.setCharacterEncoding(encoding);
filterChain.doFilter(request,response);
} catch(ServletException sx){
filterConfig.getServletContext().log(sx.getMessage());
} catch(IOException iox){
filterConfig.getServletContext().log(iox.getMessage());
}
}
//Clean up resources
public void destroy(){
}
}
//web.xml配置过滤器方法(web.xmd)
<filter>
<filter-name>setcharacterencodingfilter</filter-name>
<filter-class>com.sorc.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>setcharacterencodingfilter</filter-name>
<url-pattern>
1.使用GBK编码的解决方案
这个最简单 遇到设置编码的地方就是用GBK数据库gbk 然后在使用个过滤器过滤编码为gbk一切搞定。
效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据无乱码
2.使用UTF-8编码解决方案
所有编码都设置为UTF-8
数据库编码utf8
设置过滤器编码utf8
数据库连接?characterEncoding=utf8
然后在数据库管理工具或mysql命令行 运行 SET character_set_results = gbk;
效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据时存在乱码
3.页面使用UTF8 数据库使用latin1的解决方案
jap java tomcat 设置为UTF-8
过滤器 utf8
数据库连接?characterEncoding=latin1
数据库其他latin1
然后在数据库管理工具或mysql命令行 运行 SET character_set_results = gbk;
效果为添加数据无乱码 读出无乱码 数据库管理工具无乱码 到处sql结构和数据时存在乱码
以上都不需要页面或java代码中手动转码----------------------------------------------------------------------------------------------------------------------------------
一、JSP页面显示乱码二、表单提交中文时出现乱码三、数据库连接
大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。
一、JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>
对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。解决办法:在 JSP页面中指定编码方式(gb2312),即在页面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>
二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
下面是处理页面(process.jsp)代码:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF- 8和 GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding ("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<%
request.seCharacterEncoding("gb2312");
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上
useUnicode=true&characterEncoding=GBK 就OK了。
四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:
public class Convert {
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
return "";
}
}
}
把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。
如果你还有什么不懂之处:我给大家推荐一个好的JSP-JAVA网站:
http://www.phy.hbnu.edu.cn/dsp/
总结:
1. 在jsp中<%@ page contentType="text/html; charset=A" %>如果指定了,那么在改jsp中所有构造的String(不是引用),如果沒有指定编码,那么这些String的编码是A的。
从request的得到的String如果沒有指定request的编码的话,他是iso-8859-1的
从别的地方得到的String是使用原來初始的编码的,比如从数据库得到String,如果数据库的编码是B,那么该String的编码是B而不是A的,也不是系统默认的。
此时,如果要输出的String的编码不是A,那么,很可能显示乱码的,所以首先要将String正確转化为编码A的String,然后输出。
2. 在jsp中<%@ page contentType="text/html; charset=A" %>沒有指定,那么相当于指定了<%@ page contentType="text/html; charset=ISO-8859-1" %>
3. Servelte中如果执行了像 response.setContentType("text/html;charset=A");説明将response的字符输出流编码设置为A,所有要输出的String的编码要转化为A的,否則会得到乱码的。
Servelet中从request得到的String的编码和jsp中一样的,但是在servlet java文件中构造的String是使用的系统默认的编--------------------------------------------------------------------------
根本解决办法 所有地方都设置成GBK
-
MacOs java 乱码问题
2013-08-09 10:24:591、Mac OS下Eclipse创建文件夹乱码,SVN更新文件乱码 ... 文中提到的解决办法是将JDK1.7 回退到1.6,问题解决;后来翻帖子,有人说讲eclipse回退到3.7问题也解决;...2、macos Java乱码终极解决方案【Mac O1、Mac OS下Eclipse创建文件夹乱码,SVN更新文件乱码
地址:http://gogo1217.iteye.com/blog/1787568。
文中提到的解决办法是将JDK1.7 回退到1.6,问题解决;后来翻帖子,有人说讲eclipse回退到3.7问题也解决;但不管是那种办法,都不是我们版本控的作风。
2、macos Java乱码终极解决方案【Mac OS下Eclipse创建文件夹乱码,SVN更新文件乱码解决办法】
地址:http://gogo1217.iteye.com/blog/1850899。
文中提到添加环境变量:export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 ,但是该方法只能在Shell中启动eclipse才能识别该设置,并能生效;而在DOCK启动eclispe则无法使用该变量设置。
3、MaOS删除JAVA6后安装JAVA7,启动eclipse提示安装JRE6
地址:http://gogo1217.iteye.com/blog/1858326
文中提到了MacOS 10.8.3中 安装JDK1.7,eclipse启动问题的解决办法。
那到底怎么解决eclipse新建文件夹乱码,svn更新乱码(原因:创建文件夹乱码)的问题呢?
a. 网上有人说修改 /.MacOSX/environment.plist,但这个早已经废弃,在10.8版本中铁定不支持。
b. 有人说修改 XX.app/Contents/Info.plist,经过尝试,这个靠谱,可参考
http://www.2cto.com/os/201304/205820.html
http://qing.blog.sina.com.cn/tj/62de843e33002hwz.html
现在分享下我的解决步骤:
1、修改eclipse.app/Contents/Info.plist,添加以下代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
- <plist version="1.0">
- <dict>
- <key>LSEnvironment</key>
- <dict>
- <key>JAVA_TOOL_OPTIONS</key>
- <string>-Dfile.encoding=UTF-8</string>
- <key>LANG</key>
- <string>zh_CN.UTF-8</string>
- </dict>
添加完效果如图所示:
2、修改eclipse.app/Contents/MacOS/eclipse.ini,添加 -Dfile.encoding=UTF-8
3、关闭eclipse,重新启动。
4、如果不生效,执行命令(方法来源于:http://www.2cto.com/os/201304/205820.html):
- /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -v -f /Applications/eclipse/eclipse.app
-
关于java乱码的一些总结
2011-02-21 10:21:00<br />Java乱码是因为Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。在这里,总结一下java乱码的一些常见情况 ...Java乱码是因为Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。在这里,总结一下java乱码的一些常见情况
1.Javascript传参乱码:
在浏览器端对要传递的中文参数进行编码处理.代码如下:
xmlhttp.open("POST",url,true); //请求参数初始化
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)
xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); //向服务器端发送参数
在服务器端代码:页面jsp保证是utf-8编码
<%@ page contentType="text/html; charset=GBK"%>
接受中文参数
PrintWriter out = response.getWriter(); //得到response的输出流对象
String name1 = request.getParameter("name"); //得到KEY为"name"的请求参数
String name = URLDecoder.decode(name1,"utf-8"); //对得到的参数进行解码
out.print(name); //向浏览器端发送数据2.JSP与页面参数之间的乱码
JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式:request.setCharacterEncoding("UTF-8") 。
如果在JSP将变量输出到页面时出现了乱码,可以通过设置response.setContentType("text/html;charset=UTF-8")。JSP页面乱码通常只要在页面开始地方用上面代码指定字符集编码即可。如果还不行,那么请用下面这句话来转换 str=new String(str.getBytes("ISO-8859-1"),"页面编码方式");
3.热链接传参乱码
在传参的jsp对中文进行编码:href="new.jsp?name=java.net.URLEncoder.encode("链接")";
在接受的jsp对中文进行转码:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");
4.Java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如mysql驱动:jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK。5.Java与文件/流之间的乱码
Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用FileReader和FileWriter的父类:InputStreamReader/OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。 -
java乱码问题解决方法
2016-09-02 12:27:01单个java文件乱码 同一文件部分乱码 使用步骤项目整体乱码在项目上右键——Properties——Resource 单个java文件乱码在java文件上右键——Properties——Resource 同上同一文件部分乱码这个一般是由于同一文件中的... -
Java乱码处理
2012-04-10 16:55:27在java web开发过程中,时常会遇到这样或那样的中文乱码现象。以下是常见的几种乱码现象和解决方法: 1、 提交表单到服务端出现乱码 原因1、页面和服务端的编码不一致,只需将页面和服务端编码设为一致... -
linux java乱码 NetBean乱码
2011-05-25 16:48:00linux平台下Netbean乱码或者是一些java工具(如jconsole,jvisualvm),解决方案是给字体做链接,但是linux各个发行版以及同一个发行版的目录结构会有些细微的差别,这里的是Redhat 6系列的(Scientificlinux),... -
MY 总结:编码字符集,彻底解决JAVA乱码
2011-04-02 14:51:00编码字符集、JAVA乱码解决 -
ubuntu中java乱码
2011-10-20 19:26:38Java中文显示乱码解决方法 在ubuntu里安装java后,会发现所有java的gui都会乱码,这是因为在ubuntu 8.04里uming.ttf改成了uming.ttc,而ubuntu里java默认的中文字体就是uming.ttf,所以只要获得它就可以了,在... -
Java乱码问题解决大全
2019-07-03 21:03:58方法 request.setCharacterEncoding(Constants.ENCODED_UTF); response.setContentType(Constants.CONTENTTYPE_UTF); 参考文章: https://blog.csdn.net/tlms_/article/details/78749980 常量: ... * TODO... -
get提交乱码 post提交乱码 java乱码问题
2012-10-11 16:15:04每次碰到各种乱码问题 都搞得头大了,网上各种版本,还是自己细细总结一下 1. get方式提交:get提交方式是将连接的参数放到页面的报文头里传递的,这样页面pageEncoding设置的字符类型就无效了;出现这样的情况解决... -
jsp/java 乱码解决
2012-07-20 19:22:58自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。 一、Java中文问题的由来 Java的内核和class文件是基于unicode的,这使Ja -
java乱码 java使用的编码是utf-8还是utf-16还是unicode
2017-08-23 18:21:17java编码方案和为什么会产生乱码 -
再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
2017-08-25 16:02:14一直以为,java中任意unicode字符串,可以使用任意字符集转为byte[]再转回来,只要不抛出异常就不会丢失数据,事实证明这是错的。经过这个实例,也明白了为什么 getBytes()需要捕获异常,虽然有时候它也没有捕获到... -
Sublime Text3 编译Java乱码问题解决方案
2020-03-31 10:04:34在网上搜索Sublime Text3乱码的问题,基本所有的描述都是安装GBKConvertUTF-8的插件,这个插件安装后,确实能够以正确编码方式的保存Java文件,但是当你的代码出错时,Sublime Text会解析JAVAC的提示信息,这个信息却无法... -
java 乱码分析
2006-10-09 00:05:00在java中的字符均采用字符集UCS-2(编码为UTF-16,UCS-2可以看作所有字符集...在这过程中都有可能出现乱码. 因而这两个流向均存在编码和解码的问题. 先明确几个概念,编码和解码(encode/decode),在java中解码是指把某种 -
java乱码和转码问题
2014-09-24 16:47:12在一个项目中,碰到一个有意思的问题,在调用某个第三方接口后回调本地代码,对加密过的请求参数进行解密并转码,其中一种解码方式无效,另一种解码方式有效,何解?: 1、调用第三方接口时加密一个字符串: ... -
java乱码问题
2006-04-28 14:02:00这两天在用Struts 1.2+hibernate3.0+spring1.2+mysql5.0.19做个小系统,遇到乱码问题。以下是在网络上找到的解决办法在连接mysql数据库时,url的写法jdbc:mysql://localhost:3306/testdb?useUnicode=true&... -
Java乱码问题——配置EncodingFilter过滤器
2018-10-10 16:18:561、在公共包下创建一个EncodingFilter类作为公共使用类 package edu.ht.common; import java.io.IOException; import javax.servlet.Filter;...import javax.servlet.FilterChain;...import java... -
JAVA乱码问题汇总
2010-01-14 20:46:00文章转自:...下面是我解决乱码时候的一点小经验。欢迎指正 一、避免乱码的一些注意点:1.尽量使用统一的编码,如果你是重头开发一个 -
页面与后台传递中文乱码问题(java乱码)
2015-07-02 09:32:361、前台中文传递到后台乱码, 前台不需要处理, 系统一般都会默认把中文转化为ISO-8859-1类型, 只需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = new String( Str.getBytes("ISO-... -
一句话彻底明白java乱码问题
2015-12-30 15:24:39相信java的中文编解码问题是让许多java开发者头疼的问题,一旦遇到坑就会在GBK和UTF-8之间纠结。 我有两次痛苦的经历,一次是和另一个公司的C++平台传数据,调接口的时候因为中文乱码耽误了好多功夫,这一次是用MD5... -
java乱码详解(java中byte与char的转换)
2015-07-10 10:40:52转自:... java byte与char互转原理-转 一、字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此Java要对这些字 -
java乱码 setCharacterEncoding
2012-02-09 09:11:41在JAVA WEB开发中使用setCharacterEncoding()设置编码2008年04月11日 星期五 14:431、对于request,是指提交内容的编码: 指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1...
-
C++ STL(十六):常用算术生成算法(accumulate、fill)
-
[蓝桥杯] 骰子迷题 python解法
-
DVD数码相册大师.rar
-
Ruby On Rails路径遍历漏洞 CVE-2018-3760 漏洞复现
-
19年实务真题下午.pdf
-
第 229 场周赛记录(460 / 3483 )
-
EaUS Video Editor(视频剪辑软件)官方中文版V1.6.8.53
-
Java进阶--编译时注解处理器(APT)详解
-
C++代码规范和Doxygen根据注释自动生成手册
-
一天学完MySQL数据库
-
应届生与IT培训生,就业谁更占优势?
-
迷你 Vue 原理.png
-
投标方法论
-
Kubernetes技术分享.pptx
-
vagrant_2.2.5的64位版本
-
电机+L298Nmain.c
-
C语言零基础入门(详细讲解)
-
golang 拷贝文件 练习
-
最新中文停用词.txt
-
中文分词词典UserDict.txt