学习Java第64天,乱码问题

乱码问题产生的根本原因是什么

  1. 数据的编码和解码使用的不是同一个字符集

  2. 使用了不支持某个语言文字的字符集

  • 由上图得知,上述字符集都兼容了ASCII

  • ASCII中有什么? 英文字母和一些通常使用的符号,所以这些东西无论使用什么字符集都不会乱码

10.1.1 HTML乱码问题

设置项目文件的字符集要使用一个支持中文的字符集

  • 查看当前文件的字符集

  • 当前视图文件的字符集通过<meta charset="UTF-8"> 来告知浏览器通过什么字符集来解析当前文件

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    中文
</body>
</html>

10.1.2 Tomcat控制台乱码

在tomcat10.1.7这个版本中,修改 tomcat/conf/logging.properties中,所有的UTF-8为GBK即可

sout乱码问题,设置JVM加载.class文件时使用UTF-8字符集

  • 设置虚拟机加载.class文件的字符集和编译时使用的字符集一致

10.1.3 请求乱码问题

10.1.3.1 GET请求乱码

GET请求方式乱码分析

  • GET方式提交参数的方式是将参数放到URL后面,如果使用的不是UTF-8,那么会对参数进行URL编码处理

  • HTML中的 <meta charset='字符集'/> 影响了GET方式提交参数的URL编码

  • tomcat10.1.7的URI编码默认为 UTF-8

  • 当GET方式提交的参数URL编码和tomcat10.1.7默认的URI编码不一致时,就会出现乱码

GET请求方式乱码演示

  • 浏览器解析的文档的<meta charset="GBK" />
  • GET方式提交时,会对数据进行URL编码处理 ,是将GBK 转码为 "百分号码"
  • tomcat10.1.7 默认使用UTF-8对URI进行解析,造成前后端使用的字符集不一致,出现乱码

GET请求方式乱码解决

  • 方式1 :设置GET方式提交的编码和Tomcat10.1.7的URI默认解析编码一致即可 (推荐)
  • 方式2 : 设置Tomcat10.1.7的URI解析字符集和GET请求发送时所使用URL转码时的字符集一致即可,修改conf/server.xml中 Connecter 添加 URIEncoding="GBK" (不推荐)
10.1.3.2 POST方式请求乱码

POST请求方式乱码分析

  • POST请求将参数放在请求体中进行发送

  • 请求体使用的字符集受到了<meta charset="字符集"/> 的影响

  • Tomcat10.1.7 默认使用UTF-8字符集对请求体进行解析

  • 如果请求体的URL转码和Tomcat的请求体解析编码不一致,就容易出现乱码

POST方式乱码演示

  • POST请求请求体受到了<meta charset="字符集"/> 的影响
  • 请求体中,将GBK数据进行 URL编码
  • 后端默认使用UTF-8解析请求体,出现字符集不一致,导致乱码

POST请求方式乱码解决

  • 方式1 : 请求时,使用UTF-8字符集提交请求体 (推荐)

  • 方式2 : 后端在获取参数前,设置解析请求体使用的字符集和请求发送时使用的字符集一致 (不推荐)

10.1.3 响应乱码问题

响应乱码分析

  • 在Tomcat10.1.7中,向响应体中放入的数据默认使用了工程编码 UTF-8

  • 浏览器在接收响应信息时,使用了不同的字符集或者是不支持中文的字符集就会出现乱码

响应乱码演示

  • 服务端通过response对象向响应体添加数据

  • 浏览器接收数据解析乱码

响应乱码解决

  • 方式1 : 手动设定浏览器对本次响应体解析时使用的字符集(不推荐)

    • edge和 chrome浏览器没有提供直接的比较方便的入口,不方便
  • 方式2: 后端通过设置响应体的字符集和浏览器解析响应体的默认字符集一致(不推荐)

方式3: 通过设置content-type响应头,告诉浏览器以指定的字符集解析响应体(推荐)

相关推荐
我命由我1234517 分钟前
Photoshop - Photoshop 工具栏(46)渐变工具
经验分享·笔记·学习·ui·职场和发展·学习方法·photoshop
丝斯201122 分钟前
AI学习笔记整理(38)——自然语言处理的‌基于深度学习的语言模型
人工智能·学习·自然语言处理
~光~~1 小时前
【记录——内核模块加载到内核】基于鲁班猫4 rk3588s
c++·学习·rk3588s
diegoXie1 小时前
【R】tidyr::pivot_longer / pivot_wider 学习笔记
笔记·学习·r语言
d111111111d1 小时前
STM32平衡车测试,定时中断读取速度
笔记·stm32·单片机·嵌入式硬件·学习·模块测试
海棠AI实验室1 小时前
Python 学习路线图:从 0 到 1 的最短闭环
开发语言·python·学习
fantasy_arch2 小时前
LSTM模型学习分析
人工智能·学习·lstm
潲爺2 小时前
《Java 8-21 高频特性实战(上):5 个场景解决 50% 开发问题(附可运行代码)》
java·开发语言·笔记·学习
YJlio3 小时前
Contig 学习笔记(13.5):整理现有文件碎片的策略与批量实战
笔记·学习·stable diffusion
Master_oid3 小时前
机器学习27:增强式学习(Deep Reinforcement Learn)②
人工智能·学习·机器学习