JAVA编码(中文转码)问题总结_java中文转码问题-程序员宅基地

技术标签: java 编码解码 中文乱码  java 编码解码  

本章主要分析Java编码和解码的原理,以及中文转码存在的问题做个简单的总结

目录

1  编码基础知识

     ISO-8859-1编码

     GBK

     GB2312

     UTF-8 

2  WEB系统转换编码

      原理

     Servlet网络传输编码

     Struts2 控制编码

     Spring 控制编码

3 字符串转字节

4 字节转字符串


编码基础知识

ISO-8859-1编码

ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号

单字节,即一个字节对应一个编码,不能编码汉字        

GB2312

能编码汉字,一个汉字用2个字节编码

GBK

1) 能编码汉字,一个汉字用2个字节编码

2) 编码的汉字比GB2312更多

UTF-8

1) 能编码汉字,一个汉字用3个字节编码

2) 范围包含汉字,字母,特殊符号,gbk和utf-8之间是可以相互转换的


2 WEB系统转换编码

原理

我们以服务端和客户端的模式来做分析,例如,浏览器是客户端,web服务器是服务端。

这里有个编码和解码的过程,客户端端需要将字符串编码成字节,可以是iso-8859-1,utf-8,gbk等,默认为iso-8859-1,

且转换成字节的过程中不能丢失编码。服务端需要用发送端同样的编码方式进行解码,否则将出现乱码。

一般由服务端确定一种编码和解码的方式,然后告知客户端编码和解码的方式。

Servlet 网络传输编码

接收浏览器POST请求

以JSP为例,服务端将JSP生成HTML发送给客户端。

设置浏览器编码和解码方式为UTF-8

例如:

<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" language="java"%>

服务端解码方式1:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

服务端解码方式2:

request.setCharacterEncoding("UTF-8");

接收浏览器GET请求

如:http://localhost:8888/webtest/EncodeServlet?name=你好

浏览器将会对url进行urlEncode,编码方式为UTF-8

服务端解码方式:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

此处用request.setCharacterEncoding("UTF-8");来设置解码,不能奏效,原因是get请求将参数拼在url后面进行url encode,而web容器对url的解码是在调用servlet之前,且默认解码方式是iso-8859-1

响应给浏览器

Response设置编码:

Response是指响应给客户端时,字节的编码方式,默认为ISO-8859-1

可用如下方法查看:

response.getCharacterEncoding();

设置响应流的编码方式:

response.setCharacterEncoding("UTF-8");

设置浏览器的编码和解码方式:

response.setContentType("text/html;charset=UTF-8");

jsp设置:

<%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8" language="java"%>

pageEncoding:设置jsp文件存储编码

contentType里面的charset:设置浏览器端传输的编码和解码

解析响应时解码,发送请求时编码

要保持响应流和编码和浏览器解码方式一致,才能不乱码


HTTPClient设置编码


Struts2控制编码

Struts.xml中做如下配置:

<constant name="struts.i18n.encoding" value="utf-8"></constant>

Spring控制编码

Web.xml中配置如下:

<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>

其中encoding设置服务端编码和解码的方式

forceEncoding表示强制编码的方式


3 字符串转字节转码

String s = "s汉";
byte[] bytes1 = s.getBytes("ISO-8859-1");//丢失字符
byte[] bytes2 = s.getBytes("GBK");
byte[] bytes3 = s.getBytes("UTF-8");


4 字节转字符串

String s1 = new String(bytes1,"utf-8");//丢失
String s2 = new String(bytes2,"GBK");
String s3 = new String(bytes3,"utf-8");
















版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tangyanbo1110/article/details/40921313

智能推荐

TCP/IP协议及常见面试题_ip与路由常见面试问题-程序员宅基地

文章浏览阅读1.6k次。TCP/IP协议及常见面试题1.1 应用层1.2 运输层1.3 网络层1.4 数据链路层1.5 物理层为什么要三次握手第2次握手传回了ACK,为什么还要传回SYN?为什么要四次挥手?TCP,UDP 协议的区别URI和URL的区别是什么?Cookie的作用是什么?和Session有什么区别?1.1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层_ip与路由常见面试问题

EasyExcel操作Excel的导入和导出_easy excel 导出正确写法-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏18次。Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,_easy excel 导出正确写法

Linux下virtualbox 升级后1908错误,sudo: /etc/init.d/vboxdrv:找不到命令-程序员宅基地

文章浏览阅读5.6k次。系统Ubuntu14.04 执行sudo modprobe vboxdrvsudo service virtualbox start //启动服务//下面的可以不执行sudo update-rc.d -f virtualbox defaults如果提示缺少某些程序x 执行sudo apt-get install x如果提示依赖错误等,可以执行apt-get -f install

Jfinal 框架简单入门_jfinal框架-程序员宅基地

文章浏览阅读4.5k次。简单读懂JFinal框架各个核心配置_jfinal框架

解决报错Duplicate keys detected_duplicated key 'tests' torefs-程序员宅基地

文章浏览阅读2.4k次。报错信息原因浏览器检测到有重复的键值v-for=“item in img” :key=“item”解决v-for=“item in img” :key=“item.index”_duplicated key 'tests' torefs

多个docker容器如何共享GPU?_docker将gpu关联给已存在的容器-程序员宅基地

文章浏览阅读5.8k次。转自:https://blog.csdn.net/beckham999221/article/details/85257137 引言最近容器比较火,容器支持对CPU和内存的资源限制,但是GPU还不是很明朗,多个容器能不能共享一个GPU呢?如果共享的话,是并行的方式还是并发的方式呢?又如何确..._docker将gpu关联给已存在的容器

随便推点

2022 深度学习 之 PyTorch 常用代码段合集_深度学习实验代码-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏43次。尊重原创版权: https://www.gewuweb.com/hot/8392.htmlPyTorch 常用代码段合集尊重原创版权: https://www.gewuweb.com/sitemap.html本文是PyTorch常用代码段合集,涵盖基本配置、张量处理、模型定义与操作、数据处理、模型训练与测试等5个方面,还给出了多个值得注意的Tips,内容非常全面。PyTorch最好的资料是官方文档。本文是PyTorch常用代码段,方便使用时查阅。1. 基本配置导入包和版本查询import to_深度学习实验代码

【xamarin】xamarin debug exited-程序员宅基地

文章浏览阅读296次。https://forums.xamarin.com/discussion/3304/debugger-fails-to-start-the-program-mono-has-exited-with-code-0-0x0

DWH中增量数据的抽取-程序员宅基地

文章浏览阅读160次。1. Truncate-Load 全量加载     简单直观、不易出错,适合数据量不太大的操作     性能问题2. Increamental-Load 只考虑新增、修改、删除的记录 良好的数据源设计(主要是标识列)可能直接就给后续的增量处理提供了最直接的判断依据 1) 只有insert操作     表中的数据是不可逆的比如删除或者修改,一般会提供一列能够记载这..._staging trans和dwh

python中的pygame弹球游戏代码_pygame弹球游戏-程序员宅基地

文章浏览阅读296次。pygame弹球游戏写的很简陋pip install pygame 安装pygame模块代码,复制运行即可import pygameimport randompygame.init()win = pygame.display.set_mode((600, 600)) # 画布窗口的大小pygame.display.set_caption("弹球游戏") # 窗口标题x, y = 300, 0...__randomok()

(转)用AGG实现高质量图形输出(二)-程序员宅基地

文章浏览阅读89次。本文上接《用AGG实现高质量图形输出(一)》,分别介绍了AGG显示流程中的各个环节。上次讲了AGG的显示原理并举了一个简单的例子,这一篇文章开始讲AGG工作流程里的每个环节。为了方便对照,再放一次AGG显示流程 图另外,上一篇文章里的例程也很重要,后面的例子都将基于这个代码。下面,我们来考察AGG显示流程中的每个环节。理解每个环节最好的方法是编写实验代码,建议先参照这里建 立一个可..._cairo坐标系

c语言简单程序读写,24C01-24C256读写操作C语言程序-程序员宅基地

文章浏览阅读946次。#pragma ot(6,SIZE)#i nclude #i nclude #define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype{M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};enum eepromtype EepromType;/..._24cl256 c例程