正确的认识乱码与编码

2023-11-15


编码的本质

编码将内存字节作用于磁盘文件或者网络文件的过程,是将磁盘文件/网络文件 反解析成内存字节的过程.
这个过程中如果 内存字符串到 “字节数组”的编码 与 网络/磁盘文件的之间转化的编解码方式不一致或者不兼容就 会产生乱码.

写文件的正常流程:内存字符串->“使用编码转化为(1)”-> 字节数组 ,writer将字节数组写入文件,文件头中的编码方式如果和 字符串转化为字节数组的编码不一致或者不兼容,打开文件/再次使用文件头中的编码方式读取文件的时候就会显示乱码, 这个时候方式处理是: 如果明确知道(1)中使用的编码,那么打开文件或者读取文件主动指定(1)中使用的编码。

上面讲了乱码的原理性,在判断乱码的时候需要考虑输入源的编码是什么,输出源使用了什么编码 , 下面看几个乱码的例子.

乱码的几个例子及思考解决方案

浏览器输入到后端乱码

现象不再赘述

理论上浏览器发送请求的时候,指定编码 并使用指定的编码编码request param或者body 那么后端只要使用浏览器说的编码来 解码就能得到正确内容.

排查方式为 确认request header中的编码方式 与后端接收到并且解码的编码方式是否一致,可以使用抓包的方式判断。如果request header中没有指定编码方式,那么就看浏览器以及服务端的默认编码方式了, 所以在协议交互的过程中编码方式是最好显示指定

后端返回浏览器乱码

现象不再赘述

理论上后端返回response的时候会在response header中带上编码方式,并使用指定的编码方式编码response body 那么浏览器只要使用response header中的编码来 解码就能得到正确内容.

排查方式为 确认response header中的编码方式,了解不同浏览器的默认编码逻辑. 以及html中的其他元素标签对编码的支持

java 枚举类乱码

public enum OfcDeliveryStatusEnum {
    init(0, "数据库-初始化"),
    create(1, "生成运单"),
    accept(2, "配送待分配")
		private Integer code;
    private String desc;
}

现象:当在代码中想要使用OfcDeliveryStatusEnum.create.getDesc()的时候 发现获取到的是乱码

原因:java源文件是UTF-8格式保存的,maven编译使用的GBK格式编译生产class文件,这中间有一个文件读取到内存再输出到文件的过程,编码的差异导致格式被破坏从而产生乱码.

排查方式需要明白java的工作原理,OfcDeliveryStatusEnum.create.getDesc() 程序运行起来后直接从内存的metaspace中取出来的,如果内存中通过utf-8查看是乱码,那么内存中已经乱码了,而内存值是通过加载class文件生成的,那么class文件难道也是乱码吗?class文件是maven从java源文件编译而来,源文件正常,那只可能是编译过程出了问题

数据库存储乱码

现象不再赘述

应用程序连接mysql server之间有一次通信会话写入数据,mysql server到 存储到磁盘有一次文件存储,从mysqlserver 查询数据返回到前端有一次通信会话 可以看到这中间有3次通信,那就存在三次编码转化,分别抓住两次编码转化是否一致。

1)character_set_server:mysql server默认字符集。
2)character_set_database:数据库默认字符集。
3)character_set_client:MySQL server假定客户端发送的查询使用的字符集。
4)character_set_connection:MySQL Server接收客户端发布的查询请求后,将其转换为character_set_connection变量指定的字符集。
5)character_set_results:mysql server把结果集和错误信息转换为character_set_results指定的字符集,并发送给客户端。
6)character_set_system:系统元数据(字段名等)字符集

Linux系统显示乱码

https://help.aliyun.com/document_detail/169436.html

总结


不管什么场景,只要存在一次读写操作,如果使用的编码不一致就可能导致乱码, 现实中碰到的场景都可能使用多次读写操作的复合场景,判断乱码的方式需要分段判断,最终确认第一次出现编码不一致的一段

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确的认识乱码与编码 的相关文章

随机推荐

  • [1036]Jadx gui(JAVA反编译工具)

    github https github com skylot jadx Jadx gui是一款JAVA反编译工具 一个简单轻巧的 DEX 到 Java 反编译器 可让您导入 DEX APK JAR 或 CLASS 文件并将其快速导出为 DE
  • 实时数据库,内存数据库,关系型数据库比较

    内存数据库 内存数据库就是将数据放在内存中直接操作的数据库 它利用内存的读写速度比磁盘快 内存是随机访问而磁盘是顺序访问这两个特点 将数据保存在内存中 在内存中模仿建立表结构和索引结构并针对内存特性进行优化 相比从磁盘上访问 内存数据库访问
  • 集成电路设计开源EDA软件yosys详解1:工具安装

    yosys为一套开源的针对verilog的rtl综合框架 从本节开始将详细介绍工具的使用 并详细对源代码进行分析和讲解 首先介绍一下工具的安装和使用 yosys的git网址为https github com YosysHQ yosys 下面
  • scanner中InputMisMatchException处理

    我们知道在使用scanner进行控制台输入时候 使用next 方法输出 但是这种方法存在弊端 比如你使用nextInt 方法 但是输入一个字符串类型 就会抛出InputMisMatchException异常 首先来看一下scanner在jd
  • crmeb Java2.0集群部署教程

    crmeb Java 宝塔单机nginx负载均衡集群部署 1 添加站点 此处不做详述 2 站点设置 网站目录 关闭防跨转攻击 3 站点设置 添加反向代理 4 站点设置 配置文件 此处因为是本地测试 使用IP 端口 需要在之前的项目同级目录下
  • 关于lua语言及热更新的研究一

    lua语言是个非常强大的语言 在一些游戏里进行一些热更新操作 下面就来分享一下这个lua语言的基本语法 我这里使用了Sublime Text2 ctrl B 运行 Ctrl 快捷键注释 下面是代码 print hello 单行注释 多行注释
  • 开发工程师的职场人生路

    新闻来源 伯乐在线 当你选择计算机或者电子 自控等专业进入大学时 你本来还是有机会从事其它行业的 可你毕业时执迷不悟 仍然选择了开发做为你的职业 真是自做孽不可活 不过 欢迎你和我一样加入这个被其它人认为是风光无限的 白领 吧 恭喜 你选择
  • 一次内存溢出事故 - 用 jprofiler 分析 gc root

    事情经过 事情是这样 公司项目是一个springcloud的微服务 服务每隔半个月就会发生一次频繁的fullGC 后来定位到是缓存不合理导致的 该缓存的key是一条条sql value是表名 这个缓存是用来干嘛呢 查了下他主要是分库组件sh
  • Flutter 基于Bloc框架的封装

    1 页面状态的bloc封装 1 1 定义一个基类用于bloc用于处理页面状态 状态主要有 loading error empty 以及展示内容的showContent enum PageEnum showLoading showError
  • 基于frp原理实现的轻量级内网穿透工具frp-python

    gitee地址 https gitee com usualheart frp python github地址 https github com usualheart frp python git frp 是一个专注于内网穿透的高性能的反向代
  • mysql将某一列的值统一更改

    要在 MySQL 中将某一列的值统一更改 可以使用 UPDATE 语句 具体方法是 UPDATE 表名 SET 列名 新值 WHERE 条件 例如 要将名为 users 的表中的 age 列的值全部改为 25 可以这样写 UPDATE us
  • matlab 运行环境,Matlab运行环境

    Exception in thread main java lang UnsatisfiedLinkError Failed to find the library mclmcrrt7 14 dll required by MATLAB B
  • 学完Python,怎么变现?小哥哥10000元外快了解一下

    自学 Python 之后如果不去公司上班 自己一个人可以通过此技能挣什么钱 逆天的Python 只要你掌握了相关技术 就可以靠它赚钱 具体怎么赚 我们来看看一位小哥哥的回答 以我差不多四年的 Python 使用经验来看 大概可以按以下这些路
  • gradle学习笔记

    gradle 是一个让构建自动化的工具 类似于maven ant的功能 使用gradle可以给java项目编译 单元测试 打包 或者生成可执行的jar包等 gradle教程 Gradle Java 插件 w3cschoolJava 插件 J
  • 消息转换器封装返回体

  • 数据分析和挖掘常用方法

    数据分析和挖掘常用方法 介绍 聚类分析 回归分析 分类分析 以及其他常用分析手段 不同方法的内在业务联系 聚类分析 用户由哪些群体组成 这些群体有哪些明显特征 回归分析 未来销售趋势预测 营销投入如何影响销售 分类分析 如何筛选出更值得营销
  • 华北电力大学考研计算机专业怎么样,华电考研计算机专业排名

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1354计算机软件与理论359 1355计算机软件与理论340 1356计算机软件与理论334 1357计算机软件与理论329 1358计算机软件与理论326 1359计算机软件与理论324 1
  • css变量系列(2):小程序中使用css变量实现改变主题颜色

    使用css控制 app wxss web开发中顶层变量的key名是 root 小程序使用page page themeColor red 使用 view color var themeColor 这样的缺点是 我们无法通过 js 来更灵活的
  • uniapp微信小程序获取屏幕宽高

    uniapp开发微信小程序的时候 有时候去调整样式 你需要适配各种手机屏幕 使用 你的样式宽高就不能使用rpx 有的朋友觉得可以使用vw vh 是的 当然可以 但是要让你的元素 宽高 比如50 再去加上20rpx 怎么做 所以这时候就要去获
  • 正确的认识乱码与编码

    文章目录 编码的本质 乱码的几个例子及思考解决方案 浏览器输入到后端乱码 后端返回浏览器乱码 java 枚举类乱码 数据库存储乱码 Linux系统显示乱码 总结 编码的本质 编码将内存字节作用于磁盘文件或者网络文件的过程 是将磁盘文件 网络