常见中文乱码问题以及解决方案(web版)-程序员宅基地

技术标签: java  tomcat  idea  前端  intellij-idea  

引言

        在平常我们开发的过程中,可能会遇到各种各样的问题,其中中文乱码问题是最普遍最麻烦的,因为寻常的中文乱码会有各种形式,有前端原因,也有后台原因,所以需要具体问题具体分析。下面将从几个常见乱码问题入手,分析其原理,给出解决方案,以便到后续开发中能够尽量避免此问题的发生。

目录

引言

一、问题阐述与分析

 1.1 IDEA控制台乱码问题

 1.2 页面乱码问题

 1.3 前台参数乱码问题

 1.4 数据库插入乱码问题

 1.5 服务器乱码问题

 1.6 ​​​​​​​CSV等文件中文乱码问题

 ​​​​​​​1.7 ​​​​​​​URL中文乱码问题

 二、解决方案原理分析

 ​​​​​​​2.1 ​​​​​​​IDEA控制台乱码问题解决

 ​​​​​​​2.2 ​​​​​​​页面乱码问题解决

 ​​​​2.3 ​​​​​​​前台参数乱码问题解决

 ​​​​​​​2.4 ​​​​​​​数据库插入乱码问题解决

 2.5 ​​​​​​​服务器乱码问题解决

 2.6 ​​​​​​​CSV等文件中文乱码问题解决 

 2.7 ​​​​​​​URL中文乱码解决  

三、实践 

3.1 ​​​​​​​IDEA控制台乱码问题实践 

3.2 页面乱码问题实践

3.3 前台参数乱码问题实践

3.4 数据库插入乱码问题实践 

3.5 服务器乱码问题实践 

3.6 CSV等文件中文乱码问题实践

3.6 URL中文乱码问题实践 

 四、结论 


一、问题阐述与分析

        因为乱码问题内容比较多,而且不同的乱码问题可能的原因也有许多,这里将从以下几个问题分析:

  1. IDEA控制台乱码问题
  2. 页面乱码
  3. 前台参数乱码
  4. 数据库插入乱码
  5. 服务器乱码配置
  6. CSV等文件中文乱码
  7. URL中文乱码问题

        在开始分析这些问题之前,我们先要了解乱码产生的真正原因,因为世界上语言有很多种,每种语言要输入到计算机中,就要遵循某种编码格式,编码格式中,一般字符与编码是一一对应的,如果将文本与其原本编码不符的编码格式做对应时,就会导致乱码,比如在UTF编码中的“一”在GBK编码后的字符为“涓�”,下面列举了常见的乱码字符,以及引起乱码的原因:

 

         我们遇到这种情况时,可以按照上述方法将编码改正确,可以使用下面的java代码修改字符串的编码:

 

        需要注意的一点是,一旦修改编码后发现并不是自己想要的内容后,一定要先修改回去原来错误的编码,然后在对其他编码格式一一尝试,因为修改编码是在原本的基础上进行重新编码,如果直接修改的话,乱码所对应的真实意义也因为第一次修改被改变了,所以在修改过后的字符上再做操作是没有意义的,只会越改越乱,最后找不到一开始的乱码信息,所以做还原操作是非常有必要的。

        在了解这些基础内容后,接下来对上面的问题一一分析。

1.1 IDEA控制台乱码问题

         IDEA的控制台是我们开发人员经常查看的版块,我们注意的内容的输出、流程导向等数据如果一旦显示成乱码内容,对我们的开发是非常不利的,我们无法通过控制台查看输出内容,尤其是我们的项目再接上log4j后,日志输出内容变多,我们想要查看的内容也变多比如执行mybatis时输出sql语句以及参数就是非常重要的内容,可以及时到数据库中验证sql语句是否正常(sql语句在大型项目中可以做的工作有很多,而且sql语句的体量会非常庞大),因此我们需要首先解决此问题。

 

         问题分析可能原因有IDEA自身设置编码问题、IDEA控制台显示编码问题,也可能是服务器编码设置有问题。

 1.2 页面乱码问题

        页面乱码在开发中我们也可能遇到,这个问题其中又包含了俩种页面乱码问题,第一种就是前台页面的显示乱码,如html、jsp页面编码设置问题。第二种情况就是我们在后台拼接或是打印到前台页面显示乱码问题。这俩种虽然引起乱码方式不同,但是在显示效果上都是直观的页面乱码。 

         引起前台页面乱码的第一种情况是因为页面指定编码不正确。第二种情况就是后台的响应Response编码没有设置或者是设置不正确。具体问题具体分析。

 1.3 前台参数乱码问题

         我们在前台提交表单的时候,可能会遇到输入汉字传到后台乱码的问题,在提交表单时往往与数据库内容不正确而导致查找失败。分析原因可能是因为request请求编码没有设置或者是设置不正确。后面会具体介绍解决方案。

  1.4 数据库插入乱码问题

        在将数据插入数据库的时候,也可能遇到乱码问题,这其中有俩种可能导致乱码的情况,第一种就是前面参数乱码的问题,因为插入时数据已经乱码,所以数据库也只是实际插入内容。第二种情况就是数据库编码没有设置或者是设置不正确。即数据插入时正常,插入后乱码。第三种情况就是连接数据库时没有指定数据库的编码而导致插入乱码,以上这三种情况会在后面进行详细分析。 

 

   ​​​​​​​1.5 ​​​​​​​服务器乱码问题

        我们在启动服务器时,有时候控制台乱码问题不仅仅是IDEA编码设置问题,也可能是服务器的编码设置不正确。在实际部署项目时,我们更多的是将项目打包扔到服务器上,然后服务器启动黑窗口进行项目启动,这时如果有乱码的话就会在黑窗口上显示,所以我们在配置服务器时也要做好指定编码的工作。

    ​​​​​​​1.6 ​​​​​​​CSV等文件中文乱码问题

        在实际项目中,我们可能需要导入某个文件进行分析,如CSV、TSV、EXCL,这时IDEA的编码设置不正确也会导致乱码,这种情况解决较为方便,后续会给出解决方案。 

 

 ​​​​​​​1.7 ​​​​​​​URL中文乱码问题

        在做web项目的过程中,我们可能会使用get方式往后台传输汉字时我们获取到的数据乱码,分析原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的。所以需要配置服务器编码,到这里和上面的问题一致,然后就是针对post请求时,我们也可能会获取到乱码的内容,针对这个问题,我们也会对项目做相应的配置。具体实现方法参考下文。 

 二解决方案原理分析

 ​​​​​​​2.1 ​​​​​​​IDEA控制台乱码问题解决

        首先在出现控制台乱码问题后,首先想到的是设置IDEA的默认编码,在File-->Settings-->Editor-->File Encodings中查看当前默认编码,将编码改为UTF-8. 

        第一部分是设置全局编码,第二部分是设置项目编码,底下是设置配置文件的编码格式,我们还可以根据项目路径,针对需求设置不同的编码。

        做完这些内容后,再次启动服务器,发现控制台中文内容还是乱码,这时想到还没有设置IDEA的默认编码,打开help-->Edit Custom VM Options,在文件最下面加入-Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8这两行,其中第一行是设置IDEA的默认文件编码格式为UTF-8,第二行设置IDEA的console窗口的默认编码格式为UTF-8,第二行设置的内容是最为核心的。

         这时再启动服务器,这时服务器启动内容已经没有乱码了。

  ​​​​​​​2.2 ​​​​​​​页面乱码问题解决

        页面乱码问题上小结分析原因有俩种情况,情况一是页面本身未指定编码格式,情况二是后台向前台打印页面内容乱码,下面我们给出俩种情况的解决方案。

        情况一:设置页面的编码格式,常见前台页面设置,首先是jsp页面,在jsp页面最上方加入<%@ page contentType="text/html;charset=UTF-8" language="java" %>,指定默认编码为UTF-8格式。其次是html页面,在head标签中加入<meta charset="UTF-8">,指定默认编码为UTF-8格式。

 

 

        情况二:在往前台打印网页是,首先设置response的编码格式,因为我们在打印页面用到的PrintWriter是通过response获取到的,设置编码的方式response.setContentType("text/html;charset=utf-8");

指定response为文本模式,并且默认编码为utf-8,接下来再次启动服务器访问页面,显示内容就为正常了。        

 

   ​​​​​​​2.3 ​​​​​​​前台参数乱码问题解决

        通过表单传输到后台的数据乱码的原因是request请求没有设置编码,我们在拿到数据后首先设置request编码为utf-8,代码如下:request.setCharacterEncoding("UTF-8");接下来再次启动服务器访问页面,显示内容就为正常了。 

    ​​​​​​​2.4 ​​​​​​​数据库插入乱码问题解决

        上小结中,我们分析了数据库插入中文以及中文内容显示乱码的问题,可能存在三种情况导致数据库乱码,情况一是数据在插入数据库时已经乱码,解决方案可以参考2.3前台参数乱码问题解决这个小结的内容,这里不再赘述。

        情况二是数据库的编码设置不正确,或是没有设置编码,我们在创建数据库时,应该选择字符集为utf8,对应的mysql语句为:create database 数据库名 character set utf8;对于已经创建的数据库,也可以使用命令更改其编码。对应mysql语句如下:alter database 数据库名 character set utf8;

        使用Navicat图形化界面操作数据库编码更为简单,下面是创建数据库和修改已有数据库的方法:

 

 

         情况三是连接数据库没有设置对应的编码格式,当我们打开jdbc.Properous配置文件时,jdbc的路径在选择了数据库名后,还须指定编码格式,这里如果不设置的话也可能导致传输中文数据时传递乱码信息。具体实现方法如下:        

 2.5 ​​​​​​​服务器乱码问题解决

         在实际应用场景开发的过程中,我们要上线的程序是在单独的服务器上运行程序,这时就要求在上面部署的服务器一般不能随意停止运行,我们在线上调试唯一需要能够知晓项目运行情况的就是通过项目所打印的日志,所以要确保日志内容不能乱码,所以我们在服务器设置中要配置编码格式,具体操作步骤是打开Tomcat-->config-->service.xml配置文件,找到配置端口的标签,在后面添加编码格式为UTF-8,如下图:

 

        同样,在本地IDEA调试过程中,我们也可以在tomcat配置中添加参数以实现相同功能,具体操作如下: 

 

 2.6 ​​​​​​​CSV等文件中文乱码问题解决 

        在项目运行时,我们可能还会导入外部文件,这时极小部分可能会导致文件打开轮码,这里的问题同样可以参考2.1小结设置项目编码的问题解决,同时也可直接通过下述方法直接解决,在IDEA右下角的编码,可以直接设置,设置完成后点reload重新加载,一般就会解决问题,同时要注意转编码的问题,如果一次转不成功,要返回原编码,在此基础上重新选择编码,具体操作方法如下: 

 

 

 2.7 ​​​​​​​URL中文乱码解决  

        URL访问路径中文乱码问题主要包含俩种内容,第一种就是当我们使用get请求时url传递参数中文乱码,这个问题上面已经解决,这里不在赘述。第二种情况就是post请求时中文乱码,这里我们可以配置项目的web.xml文件,添加一个拦截器,将所有访问内容的编码设置成UTF-8,以实现访问post请求中文乱码的问题,具体实现代码如下: 

 

三、实践 

 3.1 ​​​​​​​IDEA控制台乱码问题实践 

        将上问题按步骤执行下去,我们可以看到启动服务器文字内容正常。 

 

3.2 页面乱码问题实践

        将上小结的解决问题的步骤执行后,我们访问页面中文显示正常,而且从后台打印到前台的内容也显示正常,说明分析实际思路成功。 

 

 

3.3 前台参数乱码问题实践

        将上小结介绍的request编码加上后,使用from表单传输的中文内容显示正常,登录成功。 

 

3.4 数据库插入乱码问题实践 

        将上小结介绍的避免插入数据库的中文内容乱码的方法进行改正后,运行程序登录后,插入数据库日志时,username一栏能够正确显示,表明问题已解决。 

 

3.5 服务器乱码问题实践 

        将上小结介绍的内容配置服务器编码后,在启动tomcat-->bin-->startup.bat服务器后,中文内容显示正常,表明问题已解决。 

 

3.6 CSV等文件中文乱码问题实践

        将上小结介绍的内容配置后,我们可以看到原本乱码的文件立刻变不乱码了,说明实践成功。 

 

3.6 URL中文乱码问题实践 

        将拦截器配置后,post请求获取的中文数据不乱码,表示实现成功,这里使用postman模拟测试。 

 四、结论 

         综上所述,我们在日常开发的过程中可能会遇到各种各样的乱码问题,但其实分析其原理,找好对策,就能够比较容易的解决,我常见到的中文乱码的问题以及解决方案都已列出,感谢大家点评。此文档既是我的软件管理期末作业,也是日后查漏补缺的手账。也是本人将近四年的java学习开发暂时道个别,下学期将去实习人工智能岗,未来工作谁又能说的上呢?

 

 

 

 

 

 

 

 

 

 

 

 

 

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

智能推荐

JS对table添加删除一行_var row = btn.parentnode.parentnode; r-程序员宅基地

文章浏览阅读1k次。添加一行,并用AJAX提交数据。 function submitForm() { var name = $("#name").val(); var description = $("#description").val(); var url = $("#url").val(); $.ajax({ url: '/admin/ops', type:_var row = btn.parentnode.parentnode; row.parentnode.removechild(row);

HTML学习记录(列表标签&属性)_列表标签的属性-程序员宅基地

文章浏览阅读196次。ol:有序列表标签属性值描述type1,A,a,I,i规定列表顺序类型reversed (HTML5新加)reversed列表倒叙startnumberHTML5不支持,规定列表起始<ol type="A/a/I,i">ul:无序列表标签属性值描述typedisc,square,circle规定列表顺..._列表标签的属性

FFmpeg 编译支持的格式_ffmpeg g722-程序员宅基地

文章浏览阅读332次。[meng@localhost ffmpeg-4.3.2]$ ./configure --helpUsage: configure [options]Options: [defaults in brackets after descriptions]Help options: --help print this message --quiet Suppress showing informative output --_ffmpeg g722

Python GUI 快速入门_pygui-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏22次。GUI 就是图形用户界面的意思,在 Python 中使用 PyQt 可以快速搭建自己的应用,使得自己的程序看上去更加高大上,学会 GUI 编程可以使得自己的软件有可视化的结果,更方便地参加 “互联网+”或其他创新创业大赛。目 录1 安装PyQt 与QtDesigner2 添加GUI 到 PyCharm3 界面设计测试小程序1 安装PyQt 与QtDesigner如果你想用 Python 快速制作界面,可以安装 PyQt:pip install pyQt5 -ih..._pygui

以吃货联盟初级改版为例,(面向对象初级程序设计模拟网上点餐控制台程序(第一版未使用工具辅助类)。_吃货(多实例测试)-程序员宅基地

文章浏览阅读999次,点赞2次,收藏6次。面向对象最初级程序设计思维:设计过程与抽象过程,(类是对象的模板与抽象,是具有相同属性和方法的一组对象的集 合,对象是类的实体,由属性与行为共同组成一个具体的实体。) 类与对象的关系:类是对象抽象,对象是类的实例化实体。 使用类图理解类的关系 面向对象三大特性应用:1、封装 ;2、继承;3、多态;是程序设计更符合人思考的方式。 封装:{维护数据安全性将属性私有化(以包机制,与private..._吃货(多实例测试)

Camstar技术介绍-程序员宅基地

文章浏览阅读212次。Camstar_camstar

随便推点

Oracle中通过存储过程,Function,触发器实现解析时间类型的字段并插入的对应的数据表中...-程序员宅基地

文章浏览阅读71次。摘要:之前在项目中解决了插入字符串类型的数据,今天试着写了一个插入date类型的字段,成功了,现在记录一下,以便以后查看:一:首先建立一个根据xml节点名称获取对应的xml值的Function.sql:CREATE OR REPLACE FUNCTION MIP.GetXmlNodeValue (xmlStr CLOB, nodeName VARCHAR2) RETURN VAR..._oracle sql 触发器中对date类型的字段的处理

KCF -目标检测算法总结_kcf 目标检测-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏48次。KCF简介KCF是一种鉴别式追踪方法,这类方法一般都是在追踪过程中训练一个目标检测器,使用目标检测器去检测下一帧预测位置是否是目标,然后再使用新检测结果去更新训练集进而更新目标检测器。而在训练目标检测器时一般选取目标区域为正样本,目标的周围区域为负样本,当然越靠近目标的区域为正样本的可能性越大。简单来说 KCF 是 核相关滤波算法,滤波器 和 跟踪patch 进行相乘的到相关性,对应位置较..._kcf 目标检测

汇编语言编一程序段,求双字(DX,AX)的绝对值_汇编语言求双字长数的绝对值-程序员宅基地

文章浏览阅读4.7k次。a100mov ax,ffff;把双字长数的低字放到AX中mov dx,ffff;把双字长数的高字放到DX中test dx,8000;测试双字长数的符号jz 0113;如果是非负数,则直接保存neg dx;如果是负数,则求补neg ax;求补sbb dx,0int 3g=073f:0100 0113运行附图如下:..._汇编语言求双字长数的绝对值

Qt安装MySQL驱动,解决QMYSQL driver not loaded问题_qsmqldriver-程序员宅基地

文章浏览阅读222次。根据项目https://github.com/thecodemonkey86/qt_mysql_driver翻译Get precompiled qsqlmysql.dll from releases获取编译后的qsqlmysql.dll 链接不是很懂这两个有什么区别之后put qsqlmysql.dll (if release build) / qsqlmysqld.dll (if debug build, but note that when using MinGW 8.1.0 the d_qsmqldriver

Java面试题目大汇总(附参考答案)-程序员宅基地

文章浏览阅读1.4w次,点赞61次,收藏333次。足足准备了长达3个月的面试,终于在上周拿到了阿里的offer!博主汇总整理了一份我面试之前看的一些Java面试题目,可以说是非常详细!分享给大家,希望对正在面试Java岗位的朋友有帮助哈~~(文末附参考答案)Java基础相关面试题目:JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什么作用? java 中的 Math.round(-1.5)

网络存储服务ip-san搭建_ipsan搭建-程序员宅基地

文章浏览阅读2k次。一.什么是ip-sanip-san也就是SAN(全称Storage Area Network,存储局域网络),它的诞生,使存储空间得到更加充分的利用,并使得安装和管理更加有效。SAN是一种将存储设备、连接设备和接口集成在一个高速网络中的技术。SAN本身就是一个存储网络,承担了数据存储任务,SAN网络与LAN业务网络相隔离,存储数据流不会占用业务网络带宽。在SAN网络中,所有的数据传输在高速、..._ipsan搭建

推荐文章

热门文章

相关标签