中文乱码问题整理总结

目录

1、字符编码

2、乱码产生的原因

3、乱码解决方案

3.1、解决HTML页面中的中文问题:

3.2、解决JSP页面中的中文问题

3.3、解决Servlet响应结果的中文问题

3.4解决页面数据传输的中文问题

3.5、解决HTTP(get)请求中的中文问题

3.6、解决MySQL数据库的中文问题

3.7、实现加解密过程中,报文是乱码:设置编码格式可能有误。

3.8、在本地测试是正常的,但是发布到测试环境后会乱码的问题


1、字符编码

在计算机中任何数据都是以二进制存储的,要存储一个字符就要对它进行编码,用一个二进制数与这对应,这种对应的规则,就是字符的编码。编码的规则有很多 种,一种规则所编码的“字符”的集合就叫做“字符集”。在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的,因此,平时我们所说的“字符 集”,例如GB2312、GBK和JIS等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。

最早出现的编码是ASCII码,因为早期计算机系统只支持英语。后来每个国家(或区域)规定了计算机信息交换用的字符编码集,例如中国的GB2312等作 为自己国家/区域内信息处理的基础。在程序读取字符到输出字符的过程中,就需要在不同的字符集之间进行转换,这个时候就容易出现乱码,因此要了解乱码是如 何产生的,首先要了解各种字符编码。下面对这些编码做一个简单介绍。
1)、ASCII

ASCII码是《美国标准信息交换码》,简称ASCII,它总共规定了128个字符号所对应的数字代码,使用了7位二进制的位来表示这些数字。其中包含了英文的大小写字母、数字和标点符号常用的字符,数字代号从0~127。

2)、ISO8859

ASCII码解决了英语国家的字符问题,可是欧洲各个国家的字符问题还没有解决,例如法语中就有许多英语中没有的字符,为了解决该问题,国际标准化组织的 ISO8859标准应运而生,在ISO8859的编码表中,编号0~127与ASCII保持兼容,编号128~159共32个编码保留给扩充定义的32个 扩充控制码,160为空格,161~255的95个数字用于新增加的字符代码。由于在一张码表中只能增加95种字符的代码,因此ISO8859实际上不是 一张码表,而是一系列标准,包括14个字符码表。例如,西欧的常用字符就包含在ISO8859-1字符表中,在ISO8859-7中则包含了ASCII和 现代希腊语字符。

3)、GB2312和GBK

GB2312是中国国家标准汉字信息交换用编码,简称国标码,标准号为GB2312-80。

中国的文字不是拼音文字,汉字的个数的数万之多,远远超过区区256个字符,ISO8859无能为力,但是通过借鉴ISO8859的编码思想,研 究人员解决了中文的编码问题。GB2312使用两个字节来表示一个中文,在每个字符的256种可能中,为了与ASCII保持兼容,低于128的我们不使 用。借鉴ISO8859的设计方案,只使用从160以后的96个数字,两个字节分成高位和低位,高位的取值范围从176~247共72个,低位从 161~254共94个,这样,两个字节就有72*94=6768种可能,即可表示6768种汉字。
    BG2312-80仅收录了6763个汉字,还有许多汉字没有被收录进去,为了对更多的字符进行编码,全国信息技术化技术委员会于1995年12月1日颁 布了《汉字内码扩展规范》,简称GBK。在GBK1.0中共收录了21886个汉字和图形符号,微软公司的window95系统的简体中文版开始即支持 GBK编码。GBK向下与GB2312完全兼容,向上支持ISO10646国际标准。

(4)、UNICODE

每个国家和地区都规定了计算机信息交换编码,这就造成了不同编码国家、地区之间交流上的困难,如果全世界都使用统一的编码表就好了,为此UNICODE组 织发布了UNICODE编码。这种编码使用双字节符号数对每一个字符进行编码,在UNICODE3.0.1中包含了49194个字符,将 来,UNICODE中还会增加更多的字符。UNICODE的全称是“Universal Multiple-Octet Coded Character Set”,简称UCS。

(5)、UTF-8

使用UNICODE编码,一个英文字符也要占据两个字节,对于英文信息而言就增加了一倍数据量,为了减少存储和传输英文数据的数据量,美国人又制定了一系 列用于传输和保存UNICODE的编码标准UTF,这些编码称为UCS传输格式码,也就是将UCS的编码通过一定的转换来达到使用的目的。常见的有 UTF-7、UTF-8、UTF-16等。其中UTF-8编码得到了广泛的应用,UTF-8的全名是UCS Transformation Format 8,即UCS编码的8位传输格式,就是使用单字节的方式对UCS进行编码,使UNICODE编码能够在单字节的设备上正常进行处理。

UTF-8编码是变长的编码,对不同的UNICODE可能编成不同的长度。

从理论上来说,这些根据字符集设置而进行的字符转换不应该产生太多的问题,而事实上由于应用程序的实际运行环境不同,UNICODE和各个本地字符集的补充、完善以及系统或应用程序实现的不规范,转码时还是会经常出现问题而导致乱码。

2、乱码产生的原因

Java语言内部是用UNICODE表示字符的,遵守UNICODE V2.0。Java程序无论是以字符流读/写磁盘文件,还是向URL转接写HTML信息,或从URL连接读取参数值,都会由UNICODE作为中介和本地字符编码进行转换。

在WEB应用中,浏览器、WEB服务器、WEB应用程序和数据库等各个部分都有可能使用不用的字符集,字符在不同的字符集之间进行转换时,就有可能出现乱码问题。例如一个中文字符“中”要转换为ISO-8859-1编码,在Java中先读取到的是中文字符的GBK编码“0xD6D0”,转换为 UNICODE码为“0x4E2D”,再从UNICODE编码转换ISO-8859-1编码,如果ISO-8859-1编码中没有对应的 “0xD6D0”,于是就得到“0x3F”,也就是我们经常在页面上看到一堆“?”的原因。

在WEB应用中,乱码可能在多个环节产生,下面针对可能出现乱码的几个环节,给出解决的方案。

3、乱码解决方案

1)、JSP页面最基本的乱码问题
运行下面的代码,会发现页面上出现的是乱码。

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html; charset=ISO8859-1"%>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>中文问题</title>
</head>
<body>

乱码问题
</body>
</html>
这段代码产生乱码的原因在于它有三处设置了编码格式,但是格式设置的不一致,因此导致了乱码,下面来分析这三处设置编码格式的作用。
<%@ page language="java" pageEncoding="UTF-8"%>
此处的pageEncoding="UTF-8"为JSP文件的存储格式。

<%@ page contentType="text/html; charset=ISO8859-1"%>
此处charset=ISO8859-1为JSP的解码格式。ISO8859-1是没有为汉字编码的,因此按UTF-8编码存储的文件如果用 ISO8859-1编码格式编码,其中的中文字符就会因为找不到对应的编码而显示为乱码。所以JSP文件的存储格式和它的解码格式应该是一致的。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
此处编码控制的是浏览器的解码方式,浏览器收到的只是一个字节流,它并不知道
页面是如何编码的,因此,需要一个机制来告诉浏览器页面的编码类型,标准的机制是使用<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">来指定页面的编码,当浏览器读取页面遇到这样的指示时,将使用这里制定的编码方式重新加载页面。

因此只要把三处的都设置为UTF-8或GBK即可解决乱码问题。
2)、表单使用POST提交方式提交后接收到的是乱码

WEB容器在内部编码格式是ISO8859-1,在POST方式提交时,默认的提交编码格式是ISO8859-1,这样接收到的中文信息就会是乱码,解决方式如下:
   在请求页面上开始处,执行请求和编码代码:
   request.setCharacterEncoding(“GBK”);

   把提交内容的字符集设为GBK,这样接受此参数的页面就不必再转码了,直接使用即可得到汉字参数。
   在每一个接受提交的JSP页面及Servlet中都加这样的代码是比较烦人的,可以用过滤器设置request和response的setCharacterEncoding方法来解决这个问题。
例:过滤器解决问题

public class setEncodeingFilter extends HttpServlet implements Filter {private FilterConfig config;@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");chain.doFilter(request, response);}@Overridepublic void init(FilterConfig config) throws ServletException {this.config = config;}
}

这个过滤器中已经在doFilter方法中直接设置了统一使用GBK编码,然后在web.xml国配置过滤器:

<filter><filter-name>setEncodeingFilter </filter-name><filter-class>setEncodeingFilter(过滤器的全路径)</filter-class></filter><filter-mapping><filter-name>setEncodeingFilter </filter-name><url-pattern>/*</url-pattern></filter-mapping><url-pattern>/*</url-pattern>表示所有的页面都要经过此过滤器过滤,这样就不用在JSP和Servlet中设置encoding了。 

3)、表单使用GET方式导致的乱码的处理方式

如果使用GET方式提交中文,接受参数的页面也会出现乱码,原因是web容器会以GET方式的默认编码方式ISO8859-1对汉字进行编码,编 码后追加到URL,导致接受页面得到的参数为乱码。 因为在进入URL之前已经进行了ISO8859-1的编码处理,所以需要在得到参数值后进行编码转换:
     String name = request.getParameter("name");
     name = new String(name.getBytes("ISO8859-1"),"GBK");

4)、数据库中读取和存储中文时的乱码问题

大多数的JDBC驱动都是默认IS-O8859-1为数据的传输编码格式,而数据库本身又有自己的字符集,因此在数据库读写中文数据库时也经常会出现筹码人。

流行的关系数据库系统都支持数据库Encoding,即在创建数据库时可以指定其自己的字符集设置。数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有Encoding转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。

GB23212、GBK和UTF-8等都是可选的数据库Encoding,在JSP/Servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。

3.1、解决HTML页面中的中文问题:

为了使HTML页面很好地支持中文,就必须在每个HTML页面的头部增加如下代码:

<HEAD>
...
<META http-equiv=Content-Type content="text/html;charset=GBK">
...
<HEAD>

3.2、解决JSP页面中的中文问题

为了使JSP页面很好地支持中文,就必须在每个JSP页面的头部增加如下代码:

<%@ page contentType="text/html;charset=GBK" language="java"%>

3.3、解决Servlet响应结果的中文问题

为了使Servlet页面很好地支持中文,就必须在每个Servlet页面的头部增加如下代码:

response.setCharacterEncoding("GBK");

3.4解决页面数据传输的中文问题

为了使中文数据在各页面(组件)之间正常传递,最佳的方法就是采用编码过滤器来解决。在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>GBK</param-value></init-param> 
</filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

3.5、解决HTTP(get)请求中的中文问题

在默认情况下,IE浏览器发“ISO-8859-1”的编码格式发送请求,如果接收到HTTP的get请求中文参数时出现乱码,就可以对其进行编码转换,例如:

String param = request.getParameter("param");

param = new String(param.getBytes("ISO-8859-1", "GBK"));

也可以通过修改Tomcat的server.xml文件来解决:

<Connector port = "8080"

.....

URIEncoding="GBK"/> -->增加这项

3.6、解决MySQL数据库的中文问题

解决MySQL数据库中文问题主要在JDBC驱动的URL上,例如:

jdbc:mysql://localhost/test?user=root&password=123456&useUnicode=true&characterEncoding=GBK

3.7、实现加解密过程中,报文是乱码:设置编码格式可能有误。

3.8、在本地测试是正常的,但是发布到测试环境后会乱码的问题

1)可能是编译不一致,比如,测试环境要求编译成1.4版本,而本地编译的是1.6;  

2)可能请求报文的编码和服务器编码不同,服务器是UTF-8的编码,而请求报文是GBK。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php echo中文乱码问题

用echo输出的中文显示成乱码&#xff0c; 其实应该是各种服务器脚本都会遇到这个问题&#xff0c; 根本还是编码问题&#xff0c; 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 这时候要正常显示中文需要转化一下编码方式&#xff0c;比如 echo iconv(“…

中文出现乱码最常见的几种方式解析

1、出现古文夹杂日韩文&#xff0c;以GBK读取UTF-8编码 2、出现方块形&#xff0c;以UTF-8读取GBK 3、各种符号&#xff0c;以ISO8859-1方式读取UTF-8 4、拼音码&#xff0c;带声调的字母&#xff0c;以ISO8859-1方式读取GBK 5、长度为奇数时&#xff0c;最后的字符变成问号&am…

SEO百度搜索引擎优化30min了解网站排名

目录 seo优化 介绍seo是什么 网站更新&#xff1a; 网站排名在21世纪的意义: 网站为电商引流 百度算法规则 排名流程 seo策略 规则——“学会在线球里玩” 单页面收录显示 必要条件——链接数量 日志统计——及时优化seo策略 降低识别难度 收录越多排名就越大吗 …

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记 小车实物 前言 本文是后来记录而写&#xff0c;如有不足之处&#xff0c;欢迎批评指正。 如果您觉得文章写得不错&#xff0c;欢迎一键三连。&#xff08;比心 orz&#xff09; 目录 毕设项目《基于S…

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里

最强的文本生成模型GPT-4 一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展 四、与之前 GPT 系列模型比较五…

GPT-4 官方技术报告(译)

摘要 我们报告了GPT-4的开发情况&#xff0c;这是一个大规模的多模态模型&#xff0c;可以接受图像和文本输入并产生文本输出。虽然在许多现实世界的场景中&#xff0c;GPT-4的能力不如人类&#xff0c;但在各种专业和学术基准上表现出人类水平的性能&#xff0c;包括在模拟的律…

重磅突发!OpenAI正式推出多模态GPT-4

大家好&#xff0c;今天这篇文章是我的好朋友阿法兔翻译的&#xff0c;她凌晨熬夜研究了一下 OpenAI 推出的 GPT-4&#xff0c;基本把所有发布的内容重点都读完了&#xff0c;分享给大家&#xff0c;希望能给你一些启发。 作者 | OpenAI&TheVerge&Techcrunch 翻译 &am…

Chatbox - 一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程序

简介 给大家推荐一款适用于 GPT-4 / GPT-3.5 (OpenAI API) 的桌面应用程 ChatBox&#xff0c;开源的 ChatGPT API (OpenAI API) 跨平台桌面客户端&#xff0c;Prompt 的调试与管理工具&#xff0c;也可以用作 ChatGPT Plus 平替。 下载 ► chatBox 下载安装 ⇲ 为什么不直接…

是兄弟就来找 ChatGPT 漏洞,OpenAI:最高赏金 2 万刀

这是「进击的Coder」的第 822 篇技术分享 作者&#xff1a;克雷西 发自 凹非寺 来源&#xff1a;量子位&#xff08;ID&#xff1a;QbitAI&#xff09; “ 阅读本文大概需要 5 分钟。 ” 现在&#xff0c;给 ChatGPT 找漏洞有钱挣了。 今天凌晨&#xff0c;OpenAI 宣布开启漏洞…

chatgpt赋能python:Python配色方案:让您的代码更易于阅读和管理

Python配色方案&#xff1a;让您的代码更易于阅读和管理 Python是一种广泛使用的编程语言&#xff0c;它具有简单易学、功能强大的特点。但是&#xff0c;当您开始编写更复杂的代码时&#xff0c;遇到的主题和配色问题可能会影响代码的可读性和管理能力。 为了解决这个问题&a…

LLM系列 | 09: 基于ChatGPT构建智能客服系统(query分类安全审核防注入)

简介 竹斋眠听雨&#xff0c;梦里长青苔。门寂山相对&#xff0c;身闲鸟不猜。小伙伴们好&#xff0c;我是卖热干面的小女孩。紧接前面几篇ChatGPT Prompt工程系列文章&#xff1a; 04:ChatGPT Prompt编写指南05:如何优化ChatGPT Prompt&#xff1f;06:ChatGPT Prompt实践&am…

Rabbitmq使用笔记

前言 mq的优点&#xff1a;异步提速、解耦、流量削峰 mq的缺点&#xff1a; mq宕机可能导致消息丢失、消费者未成功消费如果保证整个系统架构的事务安全、消息可能被重复消费出现幂等问题、消息未被消费到引发死信问题、消息出现消费延迟或消费异常引发的顺序消费错乱问题...…

Dapr,可能是传统应用转向微服务式应用最快的技术路线

一、开篇小记 过去的一段时间&#xff0c;一直在赶一些项目的进度&#xff0c;再加上前阵子的封控&#xff0c;一直没有时间静下心来好好整理和总结。从这周开始&#xff0c;总算有时间整理点东西了&#xff0c;就还是继续折腾了一些关于微服务的知识点。 由于我本人呢&#…

大模型 NLP 算法 大汇总

大模型 & NLP & 算法 大汇总 订阅本专栏【大模型 & NLP & 算法 知识大礼包】&#xff0c;即可获取博主多年积累的关于 【大模型 & NLP & 算法】 全部资料&#xff0c;只要59.9&#xff01;订阅成功后请主动联系博主索要资料&#xff5e; 目前大模型和…

关于midjourney、novelai的订阅购买

midjourney 最近人工智能非常火热&#xff0c;有chatgpt、midjourney及novelai等等&#xff0c;在不同领域都应用广泛&#xff0c;关于订阅购买&#xff0c;这边做个记录。 购买midjourney 注册discord账户&#xff0c;进入社区&#xff0c;直接访问公共服务器&#xff0c;进…

Unity接入大模型(小羊驼Vicuna,vLLM,ChatGPT等)

实现在Unity内部的大模型访问&#xff0c;我也是第一次接触Unity中通过大模型url访问。此博客面向新手&#xff0c;旨在给大家简单理解大模型POST和GET过程&#xff0c;还有实现简单的大模型访问。 参考博客&#xff1a;什么是chatGPT&#xff1f;Unity结合OpenAI官方api实现类…

ChatGPT 的工作原理:深入探究

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

ChatGPT私人订制!只需把文档一键上传,免费可玩

衡宇 发自 凹非寺量子位 | 公众号 QbitAI 想不想简单轻松地拥有一个私人订制GPT&#xff1f; 不如试试askwise&#xff0c;只需要上传word、pdf等各种文档&#xff0c;就能生成个性化知识库&#xff0c;然后AI在你的知识库中上下求索&#xff0c;进行回答。 浅试了一下&#xf…

台大李宏毅报告:ChatGPT (可能)是怎麼煉成的 - GPT 社會化的過程

台大李宏毅报告&#xff1a;ChatGPT &#xff08;可能&#xff09;是怎麼煉成的 - GPT 社會化的過程 ChatGPT官方Blog&#xff1a;ChatGPT未公布论文——根据兄弟模型InstructGPT论文进行猜想&#xff1a;&#xff08;1&#xff09;Chat GPT的學習四階段1.學習文字接龍2.人類老…

如何使用chatgpt生成精美PPT提高工作效率

本教程收集于:AIGC从入门到精通教程 如何快速生成精美PPT提高工作效率 一、ChatGPT生成markdown源代码 二、Mindshow登录/注册 三、导入markd