一、编码的基础概念

首先,要想解决java中文乱码问题就有必要了解一下什么是字符,字符集,编码的概念。
字符:是文字与符号的总称,包括文字、图形符号、数学符号等。
字符集:就是一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。繁体汉字字符集、日文汉字字符集等等。
计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码: 制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。
每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

二、常用的编码方式

其次,要想解决java中文乱码问题也得了解一下我们常用的编码方式:
ASCII编码是目前计算机中用得最广泛的字符集及其编码。
ISO8859-1可以表示的是西欧语言。看起来很单一为什么还在使用呢?,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。通常我们所遇到过多UTF-8这是Unicode编码的实现方式,请一定要加以区分。
GB2312字集是简体字集;BIG5字集是台湾繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号
GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。
Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是GB2312编码。

Java的内核和class文件是基于unicode

三、常用的乱码解决方法

统一系统的输入、输出和操作系统是解决乱码的基本方法,产生乱码的根本问题是字节与字符的转换过程中,你必须知道原来字节和转换后的字节的编码方式。

两类乱码:

1.java和jsp的源文件的保存方式是基于字节流的,如果编译的时候使用的编码方式和源文件不一样,就会产生乱码。在文件头加上<%@ page contentType=”text/html;charset=GBK”%>
2.java和其他存储媒介交互时产生乱码。很多存储媒介如数据库、文件、流等存储方式都是基于字节流的。Java和这些媒介交互时就会发生字符(char)与字节(byte)之间的转换。

两种方式:

使用string的字节码转换
进行字节码转换,破坏对象的封装性。

J2EE容器进行编码设置
不符合J2EE应用和容器分离的原则。

这种应用出现乱码的解决办法:

1.jsp与页面参数之间的乱码

强制指定request获取编码的方式:request.setCharacterEncoding(“GBK”)

如果jsp输出到页面出现乱码:response.setCharacterEncoding(“GBK”)

或者在web.xml中配置servlet过滤器filter

web.xml:

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>net.vschool.web.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>CharacterEncodingFilter.java:public class CharacterEncodingFilter implements Filter
{protected String encoding = null;public void init(FilterConfig filterConfig) throws ServletException
{
this.encoding = filterConfig.getInitParameter("encoding");
}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}}

2.java与数据库之间的乱码

直接使用unicode与数据库进行交互,可以在驱动的url中指定,如mysql驱动:

Jdbc:mysql://localhost/SRC?useUnicode=true&characterEncoding=GBK

3.java与文件流之间的乱码

FileInputStream/FileOutpuStream是基于字节流(byte)的,常用于读写二进制文件。

FileReader/FileWriter是基于字符(char)的。这两个类的构造函数默认使用系统的编码。

使用它们的父类InputStreamReader/ OutputStreamWriter可以指定编码类型。

InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter
(OutputStream out, Charset cs)

四、解决乱码问题的注意事项

1.一个新的系统,从页面到数据库再到配置文件,建议统一使用UTF-8

2.setCharacterEncodingFilter只对post请求有效,get一律忽略
3. JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在 URL里面使用中文,实在避免不了,就只能在生成链接的时候转码,绝对不能想当然的认为SetCharacterEncodingFilter会帮你做什 么事情。
4. 如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。
5.Ajax请求乱码 使用Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url = “GetSelectListAction.do?queryData=subTrade” + “&queryId=” + encodeURI(obj.value) + “&r=” + Math.random();
这里有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二个参数。
第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则 直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个 不同的字串就可以,保证Ajax每次都去访问服务器。

1.超长汉字Get乱码

超长的汉字做为参数传递仍然会出现乱码问题,解决方法是采用java.net.URLEncoder的 Encode方法强制转码:

<a href="TestAction.do?name=<%= java.net.URLEncoder.encode(“你好”,“UTF-8”)%>

对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是
String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);

2、utf8解决JSP中文乱码问题

一般说来在每个页面的开始处,加入:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

<%
request.setCharacterEncoding(“UTF-8”);
%>

charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为“UTF-8”

pageEncoding=“UTF-8” 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效

request.setCharacterEncoding(“UTF-8”); 是对请求进行了中文编码

有时,这样仍不能解决问题,还需要这样处理一下:

String msg = request.getParameter(“message”);
String str=new String(msg.getBytes(“ISO-8859-1”),“UTF-8”);
out.println(st);

3、Tomcat 5.5 中文乱码

)只要把%TOMCAT安装目录%/ webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。
2)在你的web.xml里加入如下几行:
Set Character Encoding
filters.SetCharacterEncodingFilter

encoding
GBK

Set Character Encoding
/*

1)完成.
2 get方式的解决办法

  1. 打开tomcat的server.xml文件,找到区块,加入如下一行:
    URIEncoding=”GBK”
    完整的应如下:

2)重启tomcat,一切OK。

4、xmlHttpRequest中文问题

页面jsp用的GBK编码

代码
<%@ page contentType=“text/html; charset=GBK”%>

javascript部分

代码

function addFracasReport() {  var url="controler?actionId=0_06_03_01&actionFlag=0010";  var urlmsg="&reportId="+fracasReport1.textReportId.value;  //故障报告表编号  var xmlHttp=Common.createXMLHttpRequest();  xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp, eval("turnAnalyPage"));  xmlHttp.open("POST",url,true);  xmlHttp.setRequestHeader( " Content-Type " , " application/x-www-form-urlencoded);  xmlHttp.send(urlmsg);  }

后台java中获得的reportId是乱码,不知道该怎么转,主要是不知道xmlHttp.send(urlmsg);以后是什么编码?在后面用java来转,试了几种,都没有成功,其中有:

代码

public static String UTF_8ToGBK(String str) {  try {  return new String(str.getBytes("UTF-8"), "GBK");  } catch (Exception ex) {  return null;  }  }  public static String UTF8ToGBK(String str) {  try {  return new String(str.getBytes("UTF-16BE"), "GBK");  } catch (Exception ex) {  return null;  }  }  public static String GBK(String str) {  try {  return new String(str.getBytes("GBK"),"GBK");  } catch (Exception ex) {  return null;  }  }  public static String getStr(String str) {  try {  String temp_p = str;  String temp = new String(temp_p.getBytes("ISO8859_1"), "GBK");  temp = sqlStrchop(temp);  return temp;  } catch (Exception e) {  return null;  }  }

5、JDBC ODBC Bridge的Bug及其解决方法

在编写一数据库管理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,如果为英文字符,存储内容完全正确,如果存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge还存在无法建表的Bug)。

对于广大需要存储中文信息的Java程序员来说,这可是一个不好的消息。要么改用其他语言编程,要么选择其他价格昂贵的数据库产品。“一次编写,到处运行”的目标,也大打折扣。能不能采用变通的方法,将中文信息进行处理后再存储来解决这个问题呢?答案是肯定的。

解决问题的具体思路、方法
  Java采用Unicode码编码方式,中英文字符均采用16bit存储。既然存储英文信息是正确的,根据一定规则,将中文信息转换成英文信息后存储,自然不会出现截尾现象。读取信息时再进行逆向操作,将英文信息还原成中文信息即可。由GB2312编码规则可知,汉字一般为二个高位为1的ASCII码,在转换时将一个汉字的二个高位1去掉,还原时再将二个高位1加上。为了处理含有英文字符的中文字串,对英文字符则需要加上一个Byte 0标记。以下提供的两个公用静态方法,可加入任何一个类中使用。

将中英文字串转换成纯英文字串

  public static String toTureAsciiStr(String str){StringBuffer sb = new StringBuffer();byte[] bt = str.getBytes();for(int i =0 ;i〈bt.length;i++){if(bt[i]〈0){//是汉字去高位1sb.append((char)(bt[i]&&0×7f));}else{//是英文字符 补0作记录sb.append((char)0);sb.append((char)bt[i]);}}return sb.toString();}将经转换的字串还原public static String unToTrueAsciiStr(String str){byte[] bt = str.getBytes();int i,l=0,length = bt.length,j=0;for(i = 0;i〈length;i++){if(bt[i] == 0){l++;}}byte []bt2 = new byte[length-l];for(i =0 ;i〈length;i++){if(bt[i] == 0){i++;bt2[j] = bt[i];}else{bt2[j] = (byte)(bt[i]|0×80);}j++;}String tt = new String(bt2);return tt;}

上例在实际编程中效果很好,只是存储的中文信息需要经过同样处理,才能被其他系统使用。而且如果中文字串出现英文字符,实际上增加了额外的存储空间。

6、Solaris下Servlet编程的中文问题及解决办法

在使用Java开发Internet上的一个应用系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服务器上,运行却出现故障——返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做关键字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

显示乱码主要是因为通过类 HttpServletResponse提供的方法setContentType 无法改变返回给客户的数据的编码方式,正确的编码方式应为GB2312或者GBK,而事实上为缺省的ISO8859-1。无法检索中文信息则是因为,客户提交的中文信息经浏览器编码到达服务器后,Servlet无法将其正确解码。

举例说明显示乱码解决方法
  Servlet 一般通常做法如下:

  public class ZldTestServlet extends HttpServlet {public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{//在使用 Writer向浏览器返回数据前,设置 content-type header ,在这里设置相应的字符集gb2312response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter(); //*// 正式返回数据out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );out.println("这是一个测试页!");out.println("〈/body〉〈/html〉");out.close();}…}

解决页面显示乱码问题,需将*处代码换成如下内容:

PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),“gb2312”));

Solaris中文信息检索问题的解决
  浏览器利用表单向服务器提交信息时,一般采用x-www-form-urlencoded 的MIME格式对数据进行编码。如果使用get方法,参数名称和参数值经编码后附加在URL后,在Java中称作查询串(query string)。

在Servlet程序中,如果采用ServletRequest的方法getParameter取得参数值,在Solaris环境下,对汉字却不能正确解码。因而无法正确检索数据库。

在Java 1.2的包——java.net中提供了URLEncode和URLDecode类。类URLEncode提供了按x-www-form-urlencoded格式对给定串进行转换的方法。类URLEncode则提供了逆方法。

7、Common Mail乱码问题

common mail是一个小而方便的mail包,他实现了对Java Mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下:
public class TestCommonMail {
public static void main(String[] args) throws EmailException, MessagingException {
SimpleEmail email = new SimpleEmail();
email.setCharset(“GB2312”);
email.setHostName(“smtp.163.com”);
email.setSubject(“test”);
email.addTo(“newledlight.com.cn”);
email.setFrom(“newledlight.com.cn”);
email.setMsg(“我的测试”);
email.setAuthentication(“test”, “test”);
email.send();
}
}

分析了一下commons mail的源码找到了原因。源码如下:

public class SimpleEmail extends Email
{
public Email setMsg(String msg) throws EmailException, MessagingException
{
if (EmailUtils.isEmpty(msg))
{
throw new EmailException("Invalid message supplied");
}setContent(msg, TEXT_PLAIN);
return this;
}
}Email代码片段
public void setContent(Object aObject, String aContentType)
{
this.content = aObject;
if (EmailUtils.isEmpty(aContentType))
{
this.contentType = null;
}
else
{
// set the content type
this.contentType = aContentType;// set the charset if the input was properly formed
String strMarker = "; charset=";
int charsetPos = aContentType.toLowerCase().indexOf(strMarker);
if (charsetPos != -1)
{
// find the next space (after the marker)
charsetPos += strMarker.length();
int intCharsetEnd =
aContentType.toLowerCase().indexOf(" ", charsetPos);if (intCharsetEnd != -1)
{
this.charset =
aContentType.substring(charsetPos, intCharsetEnd);
}
else
{
this.charset = aContentType.substring(charsetPos);
}
}
}
}email.send();的send方法将调用
public void buildMimeMessage() throws EmailException
{
try
{
this.getMailSession();
this.message = new MimeMessage(this.session);if (EmailUtils.isNotEmpty(this.subject))
{
if (EmailUtils.isNotEmpty(this.charset))
{
this.message.setSubject(this.subject, this.charset);
}
else
{
this.message.setSubject(this.subject);
}
}// ========================================================
// Start of replacement code
if (this.content != null)
{
this.message.setContent(this.content, this.contentType);
}
// end of replacement code
// ========================================================
else if (this.emailBody != null)
{
this.message.setContent(this.emailBody);
}
else
{
this.message.setContent("", Email.TEXT_PLAIN);
}if (this.fromAddress != null)
{
this.message.setFrom(this.fromAddress);
}
else
{
throw new EmailException("Sender address required");
}if (this.toList.size() + this.ccList.size() + this.bccList.size() == 0)
{
throw new EmailException(
"At least one receiver address required");
}if (this.toList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.TO,
this.toInternetAddressArray(this.toList));
}if (this.ccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.CC,
this.toInternetAddressArray(this.ccList));
}if (this.bccList.size() > 0)
{
this.message.setRecipients(
Message.RecipientType.BCC,
this.toInternetAddressArray(this.bccList));
}if (this.replyList.size() > 0)
{
this.message.setReplyTo(
this.toInternetAddressArray(this.replyList));
}if (this.headers.size() > 0)
{
Iterator iterHeaderKeys = this.headers.keySet().iterator();
while (iterHeaderKeys.hasNext())
{
String name = (String) iterHeaderKeys.next();
String value = (String) headers.get(name);
this.message.addHeader(name, value);
}
}if (this.message.getSentDate() == null)
{
this.message.setSentDate(getSentDate());
}if (this.popBeforeSmtp)
{
Store store = session.getStore("pop3");
store.connect(this.popHost, this.popUsername, this.popPassword);
}
}
catch (MessagingException me)
{
throw new EmailException(me);
}
}

由代码可以知道纯文本方式最终调用了Java Mail的
message.setContent(this.content, this.contentType);
content是内容
contentType是类型,如text/plain,
(我们可以试试直接用Java mail发邮件,设置文本内容不使用setText方法,也使用setContent(“测试”, “text/plain”)方式,你可以看到内容也是乱码)
关键就在于text/plain,我们改成text/plain;charset=gb2312,ok乱码解决了。在commons mail我们看SimpleEmail 类中setMsg方法调用的就是 setContent(msg, TEXT_PLAIN);我们只需要将Email类中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了

8、toad的字符集的设置与oracle的安装

oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为ISO编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置

环境变量—〉系统变量

NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1

AMERICAN_AMERICA.WE8MSWIN1252

或者

打开注册表,点击HKEY_LOCAL_MATHINE
再点击Software,再点击ORACLE
在点击HOME(ORACLE所在目录)
在注册表的右半面有NLS_LANG,
双击它,将你想要的覆盖掉原来的就可以了
最好记下旧的,以便可以改回来。

connect sys/chang_on_install
update props$
set value$=’ZHS16CGB231280′
where name=’NLS_CHARACTERSET’;
commit;
这样就OK了

9、如何解決GWT(google web toolkit)中文的問題

GWT 中文乱码解决方法

1.把你要显示的中文“测试字符串”输入到一个文件,如:1.txt
2.进入命令行,进入1.txt所在的目录,敲入以下命令:native2ascii.exe 1.txt 2.txt 回车。这样就生成了另外一个文件2.txt。
3.2.txt的内容如下:/u6d4b/u8bd5/u5b57/u7b26/u4e32
4.然后用上面的编码,在gwt中使用,就可以了.

10、xmlHttp得到的网页怎么是乱码?

(1)在服务器端使用WebRequest而不是xmlHttp
(2) 将

StreamReader sr = new StreamReader(stream);

对于简体中文改成:

StreamReader sr = new StreamReader(stream , Encoding.Default );
对于utf-8改成:

StreamReader sr = new StreamReader(stream , Encoding.UTF8 );
当然,Encoding枚举还有很多其他的成员,对于不同的编码content-type可以有选择的应用

(3)后来我发现无论是content-type是gb2312还是utf-8,用

StreamReader sr = new StreamReader(stream , Encoding.Default );

都可以返回正常的汉字,所以统一的改成Encoding.Default

——————————————————————————–

最后,在服务器端从一个url获得网页的源代码的代码如下:


/// <summary>
/// post一个指定的url,获得网页的源代码(用WebRequest实现)
/// </summary>
/// <param name="url"></param>
/// <returns>
/// 如果请求失败,返回null
/// 如果请求成功,返回网页的源代码
/// </returns>
public static string GetContentFromUrl2( string url )
{//变量定义string respstr;WebRequest myWebRequest=WebRequest.Create(url);//            myWebRequest.PreAuthenticate=true;//            NetworkCredential networkCredential=new NetworkCredential( username , password , domain );//            myWebRequest.Credentials=networkCredential;// Assign the response object of ‘WebRequest’ to a ‘WebResponse’ variable.WebResponse myWebResponse=myWebRequest.GetResponse();System.IO.Stream stream = myWebResponse.GetResponseStream();StreamReader sr = new StreamReader(stream , Encoding.Default );//以字符串形式读取数据流respstr = sr.ReadToEnd();sr.Close();return respstr;}

11.关于springmvc乱码问题:

1.手写过滤器:注册配置web.xml

1.web.xml中注册过滤器:

    //注册过滤器:手写方式<filter><filter-name>encoding</filter-name><filter-class>com.kuang.filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/</url-pattern></filter-mapping>

2.编写过滤器类:
创建文件夹filter->EncodingFilter

package com.kuang.filter;
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}
//过滤器解决编码乱码问题  注意:需要去web.xml中配置<filter>   传统方法。//springmvc提供了一个过滤器在web。xml中配置就可以使用。从而不用去自己手写Filter@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest,servletResponse);//让过滤器继续走下去,否则会乱码。}@Overridepublic void destroy() {}
}
2.springmvc提供的过滤器:注册配置web.xml

注:在web.xml中配置就可以使用。从而不用去自己手写Filter类

<!--   2.配置springmvc的乱码过滤器 --><filter><filter-name>characterEncodingFilter</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></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><!-- 拦截所有请求 --><url-pattern>/*</url-pattern></filter-mapping>

5.josn数据生成以及乱码解决

一、使用:jackson

.总结:
josn数据生成,传递给前端
1.导入依赖jackson包给pom.xml
2.springmvc配置文件添加josn乱码配置防止乱码
3.在类中方法上使用 @ResponseBody防止走视图解析器,让其会返回一个字符串
4.实现new对象 ObjectMapper();
5.创建对象加入数据
6.使用ObjectMapper()对象的;

1.导入依赖Fastjson包
<!--    jackson数据依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.4</version></dependency>
2.使用

1.编写实体类pojo下的User :

package com.kuang.pojo;import lombok.*;@Data
@AllArgsConstructor   //构造方法
@NoArgsConstructor
public class User {public int id;public String name;public String age;}

2.String数据转换为json数据

package com.kuang.controller;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kuang.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;//josn数据生成,传递给前端
//1.导入依赖jackson包给pom.xml
//2.springmvc配置文件添加josn乱码配置防止乱码
//3.在类中方法上使用 @ResponseBody防止走视图解析器,让其会返回一个字符串
//4.实现new对象 ObjectMapper();
//5.创建对象加入数据
//6.使用ObjectMapper()对象的;
@Controller
public class Jackson {@RequestMapping("/josn")@ResponseBody//他就不会走视图解析器,会返回一个字符串public String john() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User(1,"ajdklf","23");String str=objectMapper.writeValueAsString(user);return str;}
}
二、使用:jackson
1.导入依赖jackson包:
  <dependency><!--   fastjson数据依赖--><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.14</version></dependency>
2.使用

1.编写实体类pojo下的User :

package com.kuang.pojo;import lombok.*;@Data
@AllArgsConstructor   //构造方法
@NoArgsConstructor
public class User {public int id;public String name;public String age;}

2.String数据转换为json数据:

package com.kuang.controller;import com.alibaba.fastjson2.JSON;
import com.kuang.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.ArrayList;
import java.util.List;@Controller
public class Fastjson {@ResponseBody@RequestMapping("/s1")public String ag() {List<User> userList = new ArrayList<>();User a = new User(1, "sdf", "20");userList.add(a);String s = JSON.toJSONString(userList);return s;}
}

5.josn数据乱码解决

配置springmvc-servlet.xml文件:

<!--JSON乱码问题配置--><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven>

java乱码问题解决总结相关推荐

  1. vscode java乱码问题解决

    说明 先说明我的VSCODE已经安装了Package for Java的全套插件和 Code Runner插件,环境也已经是配好了的. 我之前已经运行了许多c代码,也没有中文乱码的问题. 问题 /** ...

  2. java执行cmd命令,返回结果中文乱码问题解决

    java执行cmd命令,返回结果中文乱码问题解决 参考文章: (1)java执行cmd命令,返回结果中文乱码问题解决 (2)https://www.cnblogs.com/kwaitfort/p/90 ...

  3. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 参考文章: (1)Java中FTPClient上传中文目录.中文文件名乱码问题解决方法 (2)https://www.cnblog ...

  4. java文件下载至linux乱码,JAVA 文件下载乱码问题解决办法

    页面设置隐藏的iframe 页面下载按钮 id="btnDown" href="javascript:void(download('btnDown'))" &g ...

  5. java.net.url 中文乱码_jsp get Url请求方式中文乱码问题解决办法

    本文章来给大家介绍关于jsp get Url请求方式中文乱码问题解决办法,有需要的朋友可参考. jsp中post方式请求一般不会乱码,如果乱码加上这句: 解决办法一 代码如下 复制代码 request ...

  6. java向mysql插入数据乱码问题解决

    java向mysql插入数据乱码问题解决 参考文章: (1)java向mysql插入数据乱码问题解决 (2)https://www.cnblogs.com/jack204/archive/2012/0 ...

  7. java.net.url 中文乱码,.Net获取URL中文参数值的乱码问题解决方法总结

    本文总结分析了.Net获取URL中文参数值的乱码问题解决方法.分享给大家供大家参考,具体如下: 解决方法: 1.设置web.config文件 2.传递中文之前,将要传递的中文参数进行编码,在接收时再进 ...

  8. python php 通信,Python和php通信乱码问题解决方法

    Python和php通信乱码问题解决方法 发布于 2014-07-29 22:28:21 | 118 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertex ...

  9. html2image乱码问题,HtmlImageGenerator字体乱码问题解决、html2image放linux上乱码问题解决...

    使用html2image-0.9.jar生成图片. 在本地window系统正常,放到服务器linux系统时候中文乱码问题.英文可以,中文乱码应该就是字体问题了. 一.首先需要在linux安装字体,si ...

最新文章

  1. Python pytagcloud 中文分词 生成标签云 系列(一)
  2. [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
  3. 如何将浮点数很好地格式化为String而没有不必要的十进制0?
  4. information_schema.routines 学习
  5. 电脑f2还原系统步骤_使用冰点还原电脑每次重启都会还原,打造一个百毒不侵的系统...
  6. js 数组遍历for..in弊端
  7. 我的第一个SpringBoot项目
  8. 搭建简单的SpringBoot开发环境
  9. CTS(15)---Android 兼容性
  10. MySQL之GROUP BY用法误解
  11. 批量导入经纬度点到奥维地图中
  12. 网页地址栏?和的意义
  13. aligned内存对齐
  14. 用@ExceptionHandler 来进行异常处理
  15. 关闭compactos_compact 命令详解 – 原来文件还能这样压缩!
  16. D - Petya and Array(树状数组,二分)
  17. 51单片机电机测速程序c语言,单片机电机测速程序
  18. 用ARIMA模型做需求预测
  19. srand和rand函数使用
  20. 计算机组成原理之外围设备

热门文章

  1. STL系列之十 全排列(百度迅雷笔试题)
  2. matlab 随机数产生
  3. 一线大厂对于Java高级架构师有怎样的要求?成为一名年薪80万需要具备什么能力
  4. 解决Win7下苹果笔记本键盘不亮问题
  5. cocos2dx+java部落战争全套游戏源码资源策划文档
  6. 解决了一个Web网页显示不全的BUG
  7. 红酒泡洋葱喝了有什么好处
  8. Android进程保活(如何尽可能避免APP被杀死)
  9. 全国身份证身份数据库sql(2021最新)
  10. 京东平台研发:领域驱动设计(DDD)实践总结