`
Josh_Persistence
  • 浏览: 1654656 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

(一)Java 中文乱码学习 与Spring @ResponseBody中的乱码 - 深入浅出Java中的中文乱码

阅读更多

                   第一篇: 深入浅出Java中的中文乱码

一、为什么会有中文乱码:

其实很简单,一句话就能说明问题: 字符在保存时的编码格式如果和要显示(解码)时的编码格式不一样的话,就会出现乱码问题。

 

二、需要了解的事实:

       1. Java中的任何String都是以UNICODE格式存在的。

      很多人因为在GBK环境中使用String,会误以为String是GBK格式,实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以UNICODE的2字节形式存在。

 

       2. String在构造时会逐一把字符按指定编码(默认值为系统编码GBK),转换为UNICODE字符,存入一个Char数组中,二这个Char数组中的元素都是无符号的16为字符。

如:对于java代码:new String(bytes, "gbk"):并不是说,生成一个GBK编码的字符串,而JDK讲会按GBK的编码逐一的讲字节数组bytes中的字符转化为UNICODE的编码。 
       假设,bytes本是按GBK编码的,构造方法在发现一个最高位为0的byte就作为ascii字符处理,如果发现最高位为1,那么就和后面的一个byte合成中文字符,再转换编码。 
       可以看出,在这个过程,编码选择错误就会导致程序按错误方法辨认bytes,乱码就出现了。 
       其实这种情况下产生的乱码,很多时候还可以通过.getBytes()方法修复。
        如:"中".getBytes("iso-8859-1");因为iso-8859-1是西欧编码,没有中文,所以"中"字被替换成63,显示'?',无法判断以前是什么值,从而显示乱码。所以如下String将被产生乱码: 
new String("中文".getBytes("iso-8859-1"), "iso-8859-1"); 
        但如果目标编码方式支持中文,就不会损坏String:new String("中文".getBytes("utf-8"),"utf-8"); 

        3. Java在显示字符时,还需要进行一次转换,把UNICODE字符转换成用于显示的字符编码形式。 
       其实很多时候,这个过程是自动的,会按系统的默认编码(一般是GBK)转换String。所以很明显如果指定转换的编码和我们指定的页面编码不一样,就会出现乱码。

这也说明虽然在Java的程序中只有一种编码(Unicode编码), 但是输出却可以有不同的编码。 
 
         4. 有时候,我们需要用 iso-8859-1格式分解String的中文,以便在不支持中文的系统中存储: 
new String("中文".getBytes("GBK"),"iso-8859-1")先通过GBK等支持中文的编码方式分解为byte数组,再作为iso-8859-1字符以组成字符串,这样就可避免了被替换为Char(63)。

 

三、需要了解的几个概念:

        1. 要想解决java中文乱码问题,首先就有必要了解一下什么是字符,字符集,编码的概念。

        1) 字符:是文字与符号的总称,包括文字、图形符号、数学符号等。
        2)字符集:就是一组抽象字符的集合。

           字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。繁体汉字字符集、日文汉字字符集等等。

        3)编码: 计算机要处理各种字符,就需要将字符和二进制编码对应起来,这种对应关系就是字符编码。

       制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。

          2. 常用的编码格式:

1) ASCII编码是目前计算机中用得最广泛的字符集及其编码。
2)ISO8859-1表示的是西欧语言的编码。由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,即时ISO8859-1表示的字符有限,但仍旧使用ISO-8859-1。 而且在很多协议上,默认使用该编码。
3)Unicode(统一码、万国码、单一码) 是一种在计算机上使用的字符编码。通常我们所遇到过多UTF-8正是Unicode编码的实现方式。
4)GB2312字集是简体字集;BIG5字集是台湾繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号
5)GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。
6)Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是GB2312编码。

 

        3. 开发中怎样避免乱码问题

1) 开发环境编码要一致。如页面编码,数据库编码等。
      Java在运行期一律以Unicode来存储字符,这样有利的支持了多语言环境。我们在开发过程中经常会用到文件读取。Java读文件的时候会用到系统默认的编码来解码文件。所以在用FileInputStream类读取文件可以指定编码读取。当然也可以在字节流和字符流相互转换时使用编码,如在InputStreamRedaerOutputStreamWriter类中指定编码。


2) JSP页面乱码通常只要在页面开始地方用下面代码指定字符集编码即可。如果还不行,可以用如下的代码来转换 str=new String(str.getBytes("ISO-8859-1"),"页面编码方式"); 

 

3)使用正确的方式来解码:

JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如: 
String str=new String(str.getBytes("开发环境编码"), "ISO-8859-1");
经过网络编码后的中文,要正确显示在页面上必须要用类似于下面的方式来解码:
Stirng str=new String(str.getBytes("ISO-8859-1"),"开发环境编码");

 

下一篇讲详细讲解另一个问题:Spring中@ResponseBody中的中文乱码问题。

http://josh-persistence.iteye.com/blog/2085015

 

 

0
1
分享到:
评论

相关推荐

    springMVC3使用@ResponseBody向浏览器返回 json,注意区分jar包前缀

    --处理 @ResponseBody 中文乱码问题 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!-- Support...

    SpringMVC中解决@ResponseBody注解返回中文乱码问题

    本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`produces`属性来指定响应内容的MIME类型和字符集。例如: ```java @RequestMapping...

    spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法

    spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法 在使用 Spring+Mybatis 框架时,经常会遇到一个问题,就是通过 @ResponseBody 返回结果时,中文字符会出现乱码的问题。这是因为在 Spring MVC 中,...

    json 中文乱码解决方案

    下面通过一个简单的例子来展示如何解决JSON中的中文乱码问题。 **假设场景**:一个简单的Java Web应用,使用Spring MVC框架,前端使用jQuery发起Ajax请求获取包含中文的JSON数据。 **步骤**: 1. **配置前端页面*...

    Spring MVC中默认的ResponseBody为String的乱码问题.pdf

    在Spring MVC框架中,开发者经常遇到ResponseBody返回的字符串出现乱码的问题,特别是当字符串中包含中文字符时。这是因为Spring MVC默认使用了StringHttpMessageConverter来处理Response Body中的字符串,而这个...

    jackon 2.9.1

    总结来说,Jackson 2.9.1是一个用于处理JSON的Java库,常与Spring MVC结合使用,通过`@ResponseBody`注解实现将Java对象直接转换为JSON并返回给客户端。在实际应用中,需要注意依赖包的正确引入,以及处理字符集以...

    SSM框架整合(解决中文乱码,二级缓存,JSON,事务)

    SSM框架整合是Java开发中常见的一种技术栈组合,包括Spring、Spring MVC和MyBatis。这个项目包针对的是在实际开发中可能会遇到的一些常见问题,如中文乱码、二级缓存、JSON处理以及事务管理。以下是这些知识点的详细...

    flex上传下载 并解决中文乱码

    在本主题中,我们将深入探讨如何使用Flex进行文件上传和下载,并解决过程中可能出现的中文乱码问题。 一、Flex文件上传 1. Flex组件:Flex中可以使用`FileReference`组件来实现文件上传。用户通过选择文件后,`...

    SpringMVC解决乱码

    SpringMVC乱码解决方案 SpringMVC是一个流行的Java Web框架,用于构建Web应用程序。然而,在使用SpringMVC时,可能会遇到乱码问题,例如在使用@ResponseBody注解时返回的数据出现乱码。在本文中,我们将讨论解决...

    用ajax传递json到前台中文出现问号乱码问题的解决办法

    后来发现,因为在controller中返回json用了@ResponseBody,而spring源码中@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,而项目用的编码为utf-8,所以传中文会出现乱码。 这里我使用了注解来解决: @...

    基于java反射机制的山寨版WEB2

    在"基于Java反射机制的山寨版WEB2"项目中,开发者利用这一特性创建了一个简易的Web应用程序,实现了文件上传下载、处理中文乱码、NEW和SPRING模式的支持以及JSON数据交互等功能。 1. **文件上传下载与中文乱码处理*...

    spring mvc 自學筆記

    在 Spring MVC 中处理中文乱码通常有两种方法: - **设置字符编码过滤器**:通过配置一个全局的字符编码过滤器来解决所有请求的乱码问题。 ```java @WebFilter(urlPatterns = "/*") public class ...

    base64,java与JavaScript实现

    ### 关于Base64编码及Java与JavaScript的实现 #### Base64简介 Base64是一种将二进制数据转换为ASCII字符串表示形式的方法。它主要用于处理非文本数据的存储和传输,例如图像、视频等多媒体文件。由于互联网传输...

    java 上传下载功能例子 连接MSQL数据库

    在这个例子中,配置了一个过滤器防止中文乱码,可能使用了`CharacterEncodingFilter`,确保请求和响应的编码一致。 4. **URL编码**: - 在文件名中可能会包含特殊字符,需要进行URL编码以确保安全传输。Java的`...

    Java Web项目中Spring框架处理JSON格式数据的方法

    在Java Web项目中,Spring框架通过Spring MVC提供了一种灵活的方式来处理JSON格式的数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有易于人阅读和编写,易于机器解析和生成等特点。由于其...

    Java面试框架高频问题2019

    **问题八:如何解决POST请求中文乱码问题,GET的又如何处理呢?** - POST请求可以通过配置过滤器解决。 - GET请求需要在客户端编码为UTF-8。 **问题九:SpringMVC的异常处理?** - 使用`@ControllerAdvice`和`@...

    单文件与多文件上传uploadify控件的java版本

    本主题将深入探讨“单文件与多文件上传”以及如何使用“uploadify控件”的Java版本来实现这一功能。 Uploadify是一款流行的JavaScript插件,它允许用户通过异步方式上传文件,提供友好的用户体验,如进度条显示、多...

    Spring MVC面试题(2022最新版)

    如何解决POST请求中文乱码问题,GET的又如何处理呢? - 对于POST请求,可以在web.xml中配置字符编码过滤器,确保所有请求都使用统一的字符编码: ```xml <filter-name>characterEncodingFilter</filter-name> ...

    Spring MVC注解开发总结

    在Spring MVC框架中,注解开发使得我们能够更简洁、高效地编写Web应用程序。下面将对标题和描述中提到的知识点进行详细总结。 一、Spring MVC注解开发的基本实现步骤 1. **创建Web工程**:首先需要创建一个Java ...

    springmvc-restful

    在IT行业中,Spring MVC是一个广泛使用的Java Web框架,它提供了构建高效、灵活和模块化的Web应用程序的能力。在处理RESTful API时,Spring MVC扮演着核心角色。本篇将深入探讨"springmvc-restful"主题,特别是关于...

Global site tag (gtag.js) - Google Analytics