(一)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类读取文件可以指定编码读取。当然也可以在字节流和字符流相互转换时使用编码,如在InputStreamRedaer和OutputStreamWriter类中指定编码。


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

 

 

基于STM32单片机设计的红外测温仪(带人脸检测)_34 当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。 阅读详情

相关推荐

Vivado固化程序与Flash型号添加实战指南

本文详细介绍了Vivado程序固化到Flash芯片的完整流程,包括基础操作、Flash型号添加方法及疑难问题排查。针对Vivado官方支持列表缺失的Flash型号,提供了手动添加配置的详细步骤和参数说明,并分享了高级技巧与安全操作建议,帮助开发者高效完成FPGA程序固化。

weixin_29291573的博客 565

Springmvc的@RequestBody注解汉字乱码(urlendoce码)

前端传入的汉字变成这样 像这样把你的String装起来即可正常输出汉字 URLDecoder.decode(msg,"UTF-8");

lgq2941109633的博客 767

头歌平台-人工智能导论实验(人脸识别)

答案仅供参考,自己动手丰衣足食!!!

qq_52119136的博客 3026

SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法

今番又遇到乱码问题,有时候真觉得英语母语的那些地区确实挺省事的,至少不用为了这个经典麻烦去折腾。 网络上讨论乱码问题的文章很多,因为各作者使用的计算机环境的不同,往往不是很全面。 这里非常推荐的一篇文章: [url]http://dohkoos.name/java-garbled-analysis.html[/url] 简而言之,乱码的“根本原因是由于编码和解码采用的不是同一种码”...

iteye_19759的博客 368

CXL协议-第三章 CXL事务层

CXL.io为I/O设备提供了一个非一致的负载/存储接口。图3-1显示了Flex总线分层层次结构中的位置。事务类型、事务分组格式、基于信用的流量控制、虚拟通道管理和事务排序规则遵循PCIe*定义,详情请参考PCIe基础规范的“事务层规范”章节。本章重点介绍了用于CXL.io的著名的PCIe操作模式或特性。

qq_41305217的博客 2769

编译原理2024期末复习(面向做题,大题速学)【太原理工大学】

归约-归约”冲突就是在项目集规范族一个状态中两个。

m0_63181421的博客 1万+

SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。一般的请

末路狂奔》》》》 943

葵花(Himawari)8/9卫星数据处理

李国春 葵花8(含葵花9,下同)是静止气象卫星,数据范围是星下点为140°E赤道上空的大圆盘。空间分辨率有500m、1km和2km三种。虽然其空间分辨率不高,但是有极高的时间分辨率,观测数据刷新仅10分钟。这对一些生态、农业和大范围自然灾害的动态检测具有非常高的应用价值。本文介绍如何使用RSD处理葵花8数据。

副组长的博客 1万+

SpringMvc @responseBody 返回中文乱码问题

@RequestMapping(value = "saveGoods",produces="text/html;charset=UTF-8") @ResponseBody

weixin_43726822的博客 438

Android16 RK3576修改亮度调节为线性调节

文章摘要: 本文分析了Android系统中亮度调节的非线性问题,并提供了线性化改造方案。首先通过追踪Settings和SystemUI代码,发现亮度调节使用了BrightnessUtils类中的非线性Gamma空间转换算法。然后重点修改了BrightnessUtils类,将原有的Hybrid Log Gamma(HLG)算法替换为简单的线性映射公式。最后在自定义工具窗口中实现了基于系统标准接口的亮度调节功能,通过SeekBar的0-100%百分比值线性映射到1-255的系统亮度值。改造后的亮度调节更加直观,

tzj1058756809的博客 75

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

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

第一篇: 深入浅出Java中的中文乱码 一、为什么会有中文乱码: 其实很简单,一句话就能说明问题: 字符在保存时的编码格式如果和要显示(解码)时的编码格式不一样的话,就会出现乱码问题。 二、需要了解的事实: 1. Java中的任...

chuangsishi3713的博客 356

PCL 直通滤波

内容抄自优快云点云侠:[【2024最新版】PCL点云处理算法汇总(C++长期更新版)](https://blog.csdn.net/qq_36686437/article/details/114160640)。质量无忧,永久免费,可放心复制粘贴。

m0_51204289的博客 903

Spring Mvc中@ResponseBody中文乱码解决

spring 3 mvc 的 @ResponseBody返回数据用起来很方便,但是中文乱码,而且返回的Content-Type不带编码信息,解决方法如下 方法一: 自己继承AbstractHttpMessageConverter,写一个类复制 StringHttpMessageConverter.java的代码,将 public static final Charset DEFAULT_CH

技术总结与分享 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

解决@ResponseBody注解返回中文乱码

解决@ResponseBody注解返回中文乱码 环境: mac OS Catalina + Java 8 + Tomcat 8.5 + Intellj IDEA 2019.1 症状: 在新买的 mini 上搭建了 Java 开发环境,使用了 SSM 框架。测试一下,发现……@Responsebody 注解返回的字符串乱码!! 1. 检查 IDEA 中对项目的设置 查看了 项目配置及 IDEA ...

人称大叔的博客 1502

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Mvc中@ResponseBody中文乱码解决汇总

spring 3 mvc 的 @ResponseBody返回数据用起来很方便,但是中文乱码,而且返回的Content-Type不带编码信息,网上有很多解决方法,但是大部分都存在一些问题,这里只介绍一种,如下: 自己写一个继承StringHttpMessageConverter的类UTF8StringHttpMessageConverter,内容参考 StringHttpMessageCo

⊱☞菜鸟笔记☜⊰ 1004

@ResponseBody返回中文乱码

在使用SSM后台项目中,我想要使用一个@ResponseBody返回中文信息,但是我发现了乱码情况。 package com.xjj.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import ...

weixin_45501830的博客 554

Java 中文乱码学习 与Spring @ResponseBody中的乱码 - Spring @ResponseBody中的乱码

如果在Spring的@Responsbody返回的内容中,发现乱码,需要从以下几方面来解决。   1. 确保在web.xml中配置Spring的Character Encoding Filter:     Xml代码          filter>           filter-name>Set Character Encodingfilt

yiluoAK_47的专栏 1028

使用@ResponseBody的中文乱码问题

在为一个大作业搭建后台的时候,发现调用接口返回的数据中文乱码,中文都显示?????,在网上找了很多解决方法,有使用 RequestMapping(value = "testPersonalValidtor.do",produces = "application/json;charset=utf-8") 方法的,但我觉得每个方法都要加这个声明太麻烦,想在配置文件修改编码格式,一劳永逸

xhk_123的博客 2641

SpringMvc返回@ResponseBody中文乱码

使用SpringMvc的@ResponseBody返回指定数据的类型做为http体向外输出,在浏览器里返回的内容里有中文,会出现乱码,项目的编码、tomcat编码等都已设置成utf-8,如下返回的是一个字符串中文乱码。 Java代码   @RequestMapping("user/get_comment_list.do")       public @ResponseBo

guanfang508的博客 329

spring @ResponseBody中文乱码问题

在spring mvc 中,通过ajax访问controller通常希望访问

ぞ漏网之鱼み 472

Spring MVC @ResponseBody响应中文乱码

问题: 在前端通过get请求服务端返回String类型的服务时,会出现中文乱码问题 原因: 由于spring默认对String类型的返回的编码采用的是 StringHttpMessageConverter >>> spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list则...

365

SpringMVC 使用@ResponseBody返回json 中文乱码

场景    小编在springMVC框架中使用@ResponseBody注解从controller层想ajax返回String类型的参数的时候,发现中文乱码,这确实个尴尬的问题,于是小编跟踪了一下spring的源码,看了看string类型的转换问题,在这个方法中我们可以看到,spring中解析字符串的转换器默认的编码竟然是ISO-8859-1,这就是问题所在了:        既然找

Jack 架构师之路 2099

Spring3 MVC使用@ResponseBody的乱码问题及解决办法

近日用Spring3的MVC写东西,深感其之于Webwork/Struts2的便利,但是在通过@ResponseBody这个annotation输出一个json字符串的时候,发现页面上获得的json字符串中文字符出现了乱码的现象。通过firefox观察返回的字符串,中文部分全部变成了?????的形式,初步判定是返回时,spring处理@ResponseBody使用了错误的编码。 因为我在web.

沉默非金 1845

@ResponseBody,StringHttpMessageConverter 中文乱码的几种解决办法

今天测试接口,发现Postman测试时编码正常,一到浏览器就出现乱码了,综合之前遇到的,大概罗列一下,出现乱码的可能和解决方案。 1、Postman测试接口返回中文显示乱码 可以去Tomcat服务器目录下添加配置:URIEncoding="UTF-8"。到Tomcat 目录>conf>server.xml,编辑server.xml,找到Connector节点,添加URIEncodi...

时光有伱,记忆成花~ 2297
上一篇: 五、Java内存数据库实践之深入浅出Redis - Jedis分布式(Sharding/Sharded)
下一篇: (二)Java 中文乱码学习 与Spring @ResponseBody中的乱码 - Spring @ResponseBody中的乱码...
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值