乱码之UTF-8 GBK

2024-06-14 08:08
文章标签 乱码 utf gbk

本文主要是介绍乱码之UTF-8 GBK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在提交JSP时对于乱码问题,首先我们要搞清楚为什么会出现乱码?
看JSP的头文件:<%@ page contentType="text/html;charset=UTF-8" language="java"%>
在这个头文件中,还有一个与编码的相关的属性:pageEncoding
-----------------------------------------------------------------------------------------
首先,说说JSP/Servlet中的几个编码的作用。     
在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet 中。
-----------------------------------------------------------------------------------------

request.setCharacterEncoding("UTF-8")的作用是在服务器端设置客户端请求进行重新编码的编码。    

(struts2里面 是在struts.xml 配置<constant name="struts.i18n.encoding" value="UTF-8"></constant>)

      该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。     
response.setCharacterEncoding("UTF-8")的作用是指定在客户端对服务器响应进行重新编码的编码。     
      服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。
-----------------------------------------------------------------------------------------
一、浏览器是怎么样对接收和发送的数据进行编码的 
1.浏览器接受数据:
    response.setCharacterEncoding("UTF- 8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP中设置response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文。
    读者可以做个实验,在JSP中设置response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面 时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。
2.浏览器发送数据:
     浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使response.setCharacterEncoding参数来进行URL编码的。以百度和 GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索"汉字",GOOGLE会将其编 码为"%E6%B1%89%E5%AD%97",这是因为百度的response.setCharacterEncoding参数为GBK,而 GOOGLE的的response.setCharacterEncoding参数为UTF-8。 
--------------------------------------------------------
二、服务器是在接收和发送数据时,是如何对数据进行编码的
1.服务器发送数据
     对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。   
2.服务器接收数据
     对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。     
     因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。   
     ①对于表单中POST方式提交的数据
     只要在JSP页面上设置了response.setCharacterEncoding或contentType或pageEncoding为"utf-8",在接受数据的JSP/SERVLET中都不会出现中文乱码问题。
     ②对于URL提交的数据和表单中GET方式提交的数据
     在接收数据的JSP/SERVLET中仅仅设置request.setCharacterEncoding参数是不行的
     因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),要解决该问题:     
     应该在Tomcat的配置文件server.xml的Connector标签中设置useBodyEncodingForURI或者 URIEncoding属性,其中URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。
     其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding 参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false;
     URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。    
 ----------------------------------------------------------   
下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。     
1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。     
2、正确设置JSP的pageEncoding="UTF-8" 
3、在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。     
4、对于非表单提交的get或url请求,可以修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为 UTF-8(有可能影响其他应用,所以不推荐)。或者用下面的方法,在接收数据时处理:
  request.getParameter("userID"),得到userID的值   
  request.getParameter("userID").trim()将这个值去掉两边的空格   
  request.getParameter("userID").trim().getBytes("ISO-8859-1"))将这个String用ISO-8859-1编码成一个字节数祖   
  new   String(request.getParameter("userID").trim().getBytes("ISO-8859-1"),"utf-8")将刚才的字节数祖传进string的构造函数按照"utf-8"编码创建一个string对象。 
5.使用URLEncoder的方法
传参前用: 
//使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式
String username_encoder = URLEncoder.encode(username,"UTF-8");
接参数后显示用:
//使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码
String username_decoder = URLDecoder.decode(request.getParameter("username"),"UTF-8");
-----------------------------------------------------------------------------------------
什么是"gbk"?什么是"utf-8"?
一、字符上区分 
  GBK包含全部中文字符; 
  UTF-8则包含全世界所有国家需要用到的字符。
二、编码上区分 

  UTF-8 :可变长度:英文一字节,中文>=3字节 貌似没有2字节的

GBK:固定长度:中英文都是2字节

 

当然 还要记得看服务器mysql字符编码是怎样的 毕竟如果很多人用的话 当然还要考虑别人 服务器mysql是utf8所以我们都设置为UTF-8 省事


所以. jsp每次开头加这段话

<%@ page language="java" contentType="text/html;charset=utf8"  isELIgnored="true" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><base href="<%=basePath%>"/>

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

20151209更新

今天遇到一个问题: 中文链接 如 www.abc.com/myaction/搜索  or .../我是中文文件.zip   后台获取链接时转换编码为utf8无效

在http://www.jb51.net/article/37149.htm 得到解答,

并在老师提示下了解了,tomcat默认是ISO8891编码,难怪之前get请求的参数需要将ISO8891转为utf-8

具体转换就是:

在tomcat的server.xml 
增加一个属性:URIEncoding="UTF-8" 
修改之后为: 

<Connector port="8080" protocol="HTTP/1.1" 
maxThreads="150" connectionTimeout="20000" 
redirectPort="8443" URIEncoding="UTF-8"/> 

Servlet Container:tomcat包含了这个容器

在servletcontainer那边设置最方便 不然你后面要遇到一个情况就设置一下
注意:
如果之前解决get乱码的时候这样获取的 
search = new String(search.getBytes("iso8859-1"),"utf-8");//get方式提交的参数编码,只支持iso8859-1编码。
现在就不需要了 否则反而会乱码。
顺便get:jsp脚本语言 修改其中的Java代码无需重启应用

这篇关于乱码之UTF-8 GBK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059847

相关文章

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

彻底解决win10系统Tomcat10控制台输出中文乱码

彻底解决Tomcat10控制台输出中文乱码 首先乱码问题的原因通俗的讲就是读的编码格式和写的解码格式不一致,比如最常见的两种中文编码UTF-8和GBK,UTF-8一个汉字占三个字节,GBK一个汉字占两个字节,所以当编码与解码格式不一致时,输出端当然无法识别这是啥,所以只能以乱码代替。 值得一提的是GBK不是国家标准编码,常用的国标有两,一个是GB2312,一个是GB18030 GB1

matplotlib中文乱码问题

在使用Matplotlib进行数据可视化的过程中,经常会遇到中文乱码的问题。显示乱码是由于编码问题导致的,而matplotlib 默认使用ASCII 编码,但是当使用pyplot时,是支持unicode编码的,只是默认字体是英文字体,导致中文无法正常显示,所以显示中文乱码。 文本使用系统默认字体、手动指定字体、使用字体管理器来解决。 一、系统默认字体(全局设置字体) 在Matplotlib中

产出文件乱码问题

产出到文件的部分繁体字字符串出现乱码 主要原因是从数据库读取的字符是GBK,产出的字符串编码设置成立GB2312,字符集部分不匹配,产出字符串的编码改成GBK后问题解决。

在Unity环境中使用UTF-8编码

为什么要讨论这个问题         为了避免乱码和更好的跨平台         我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快

Tomcat控制台乱码问题已解决(2024/9/7

步骤很详细,直接上教程 问题复现: 情景一 情景二 原因简述 这是由于编码不一致引起的,Tomcat启动后默认编码UTF-8,而Windows的默认编码是GBK。因此你想让其不乱码,只需配置conf\logging.properties的编码格式即可 解决方法演示🟢 然后重新启动Tomcat即可 效果演示

解决IntelliJ IDEA 使用 TOMCAT 中文乱码问题

运行tomcat时,控制台乱码 1)打开Run/Debug Configuration,选择你的tomcat 2)然后在 Server > VM options 设置为 -Dfile.encoding=UTF-8 ,重启tomcat