Java中文乱码浅析及解决方案
Java中文乱码浅析及解决方案
- 一、GBK和UTF-8编码方式
- 二、idea和eclipse的默认编码方式
- 三、解码和编码方法
- 四、代码实现
- 编码
- 解码
- 五、额外知识扩展
一、GBK和UTF-8编码方式
- 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
- 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节
二、idea和eclipse的默认编码方式
其实idea和eclipse的默认编码方式是不一样的哦。
idea默认的编码方式是:UTF-8

eclipse默认采用的编码方式是GBK
三、解码和编码方法
1、java中编码的方法
- public byte[] getBytes() 使用默认的编码方式进行编码
- public byte[] getBytes(Charset charset) 使用指定方式进行编码
2、java中解码的方法
- public String(byte bytes[]) 使用默认的方式进行解码
- public String(byte bytes[], String charsetName) 使用指的方式进行解码
四、代码实现
以下代码demo均采用idea开发哦
编码
1、使用默认的编码方式进行编码
看下面这段代码,请猜一猜数组中的元素有几个?
package com.heima.demo;import java.util.Arrays;public class TestDemo {public static void main(String[] args) {String str = "dk你好";byte[] bytes = str.getBytes();System.out.println(Arrays.toString(bytes));}
}
你答对了吗?数组中一共有8个元素,因为idea默认采用的编码方式是utf-8,如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节。我们看一下运行结果
[100, 107, -28, -67, -96, -27, -91, -67]Process finished with exit code 0
如果使用指定的编码方式GBK进行编码呢?我们看一下代码
public class TestDemo {public static void main(String[] args) throws UnsupportedEncodingException {String str = "dk你好";byte[] bytes = str.getBytes("gbk");System.out.println(Arrays.toString(bytes));}
}
答案是:数组元素一共有6个,因为采用的是GBK编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节。
我们看一下运行结果
[100, 107, -60, -29, -70, -61]Process finished with exit code 0
解码
1、使用默认的方式进行解码
package com.heima.demo;import java.io.UnsupportedEncodingException;public class TestDemo {public static void main(String[] args) throws UnsupportedEncodingException {String str = "dk你好";byte[] byte1 = str.getBytes();String res1 = new String(byte1);System.out.println(res1);}
}
运行结果如下:
dk你好Process finished with exit code 0
如果给他加上指定编码方式呢?
package com.heima.demo;import java.io.UnsupportedEncodingException;public class TestDemo {public static void main(String[] args) throws UnsupportedEncodingException {String str = "dk你好";byte[] byte1 = str.getBytes();String res1 = new String(byte1,"gbk");System.out.println(res1);}
}
运行结果
dk浣犲ソProcess finished with exit code 0
我们发现有乱码产生。那为什么呢?因为编码的时候,采用的是默认的utf-8方式,所以解码的时候,也需要使用utf-8进行解码,如果使用gbk就会产生乱码。因为utf-8和gbk对中文所占的字节数是不一样的。
- 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节
- 如果采用GBK的编码方式,那么1个英文字母 占 1个字节,1个中文占2个字节
五、额外知识扩展
1、什么是字符集?
字符集顾名思义,就是用来装多个字符的集合。不同的字符集中字符的个数是不同的,包含的字符也是不同的,甚至对于字符的编码格式也是不同的。
2、什么是字符编码?
计算机中存储信息都是以二进制数表示的,而我们在电脑屏幕上看到的文字、数字、英文、标点符号等都是将二进制数转换过后的结果,按照某种规则,将计算机中的二进制数与某个抽象字符集合一一对应,这就是字符编码。
3、ASCII字符集
ASCII 全称 (American Standard Code for Information Interchange)美国信息交换标准代码,它是基于拉丁字母的一套电脑编码系统,其最初在创建的时候主要是为了显示英语以及一些西欧语言,是国际通用的信息交换使用标准码。ASCII使用了7位二进制来表示128个字符和符号,目前已经停止更新。
4、Unicode字符集
ASCII字符集只包含了128个字符,对于全世界的所有语言来说,并不能容纳下世界上所有的语言。所以Unicode字符集出现了。
Unicode又被称为统一码、万国码,是国际组织制定的用来容纳全世界字符的编码方案。是的,确切的说Unicode是一种编码方案,以实现跨语言、跨平台的文本处理、转换的要求。
但是Unicode只是一种字符与二进制数之间的一种逻辑映射编码,它并没有指定在计算集中应该如何的进行存储。所以此时就需要一种编码格式用来指定Unicode字符集中的字符是如何进行编码的。
在Unicode官方资料中,Unicode编码方式有三种:UTF-8、UTF-16、UTF-32,而其中UTF-8编码成为了现今互联网使用较多的编码方式。
5、GB2312
GB2312编码是第一个汉字编码国家标准,于1980年由中国国家标准总局发布。其中共收录了汉字6763个。但是由于我国的汉字非常多,GB2312收录的汉字不够用了,所以GBK诞生了。GBK包含了GB2312的所有内容的同时还新增了20000多新的汉字,对于一些日常需求已经为完全够用了。
相关文章:
Java中文乱码浅析及解决方案
Java中文乱码浅析及解决方案 一、GBK和UTF-8编码方式二、idea和eclipse的默认编码方式三、解码和编码方法四、代码实现编码解码 五、额外知识扩展 一、GBK和UTF-8编码方式 如果采用的是UTF-8的编码方式,那么1个英文字母 占 1个字节,1个中文占3个字节如果…...
【前端基础--3】
文字样式 1.文字颜色 color 取值方式: 英文单词 red green blue十六进制的颜色值 #000000 也可以写为#000(如aabbcc可以简写为abc)rgb三原色取值 color:rgb(220,32,215) 取值范围都在0~255之间 2.文字大小 font-size …...
Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
51单片机电子密码锁Proteus仿真+程序+视频+报告
目录 视频 设计分析 系统结构 仿真图 资料内容 资料下载地址:51单片机电子密码锁Proteus仿真程序视频报告 视频 单片机电子密码锁Proteus仿真程序视频 设计分析 (1)能够从键盘中输入密码,并相应地在显示器上显示‘*’; (2)能够判断密码…...
[BSidesCF 2020]Had a bad day
先看url,发现可能有注入 http://655c742e-b427-485c-9e15-20a1e7ef1717.node5.buuoj.cn:81/index.php?categorywoofers 试试能不能查看index.php直接?categoryindex.php不行,试试伪协议 把.php去掉试试 base64解码 <?php$file $_GET[category];…...
[笔记]事务简介-springboot
在Spring Boot中,事务的管理通常通过注解来实现,使得配置变得简单而直观。这种方式与Spring Boot的设计理念一致,即减少显式配置,增加自动配置。以下是如何在Spring Boot项目中应用和管理事务的详细说明: Spring Boot中…...
初识计算机网络 | 计算机网络的发展 | 协议初识
1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和事物发展的根本动力!” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中(商业的推动,国家政策推动)&…...
【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。
特性 可以自定义主键、配置选项支持预定义节点图标:folder文件夹|normal普通样式多个提示文本可以自定义支持动态接口增删改节点可以自定义根节点id可以设置最多允许添加的层级深度支持拖拽排序,排序过程还可以针对拖拽的节点深度进行自定义限制支持隐藏…...
vue2面试题:vue组件之间的通信方式有哪些?
vue2面试题:vue组件之间的通信方式有哪些? 回答思路:1.组件通信的目的-->2.组件通信的分类-->3.组件通信的方案1.组件通信的目的2.组件通信的分类3.组件通信的方案(1)通过props传递数据(2)…...
Pytorch神经网络模型nn.Sequential与nn.Linear
1、定义模型 对于标准深度学习模型,我们可以使用框架的预定义好的层。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。 我们首先定义一个模型变量net,它是一个Sequential类的实例。 Sequential类将多个层串联在一起。 当给…...
C++-gdb调试常用功能
文章目录 启动gdb运行程序设置断点运行控制查看源码查看信息查看变量线程相关 gdb调试常用功能如下,其中bin为要调试的程序,arg为参数 启动gdb 启动调试 gdb bin带参数启动 gdb --args bin arg1 arg2so预加载LD_PRELOAD/path/to/lib.so && gdb …...
快速上手的AI工具-文心一言辅助学习
前言 大家好晚上好,现在AI技术的发展,它已经渗透到我们生活的各个层面。对于普通人来说,理解并有效利用AI技术不仅能增强个人竞争力,还能在日常生活中带来便利。无论是提高工作效率,还是优化日常任务,AI工…...
Boost 适用 filesystem 库,statx 函数无法找到引用问题的解决方案。
1、boost 高版本使用了 statx 函数,这个函数是在 Linux 内核版本 4.11 之后引入的。 所以:可以升级 Linux 内核版本到4.11之后即可。 2、降低 boost 库版本到 1.70 以下 3、正确的路,改 boost 的编译代码 先看这个: Filesyste…...
MyBatis中一级缓存是什么?SqlSession一级缓存失效的原因?如何理解一级缓存?
一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况: 1) 不同的SqlSession对应不同的一级缓存 2) 同一…...
项目解决方案:多地医馆的高清视频监控接入汇聚联网
目 录 一、背景 二、建设目标及需求 1.建设目标 2.现状分析 3.需求分析 三、方案设计 1.设计依据 2.设计原则 3.方案设计 3.1 方案描述 3.2 组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1概述 2.2存储设计 …...
【前端基础--2】
选择器优先级 style标签中: .text{color: pink;}div{color: red;}#box{color: skyblue;} body标签中: <div class"text" id"box">猜猜我是什么颜色的</div> 运行结果: 选择器优先级权重: id选…...
【GitHub项目推荐--提取文字】【转载】
提取视频中的字幕 这个开源项目是提取视频中字幕的开源项目,提取视频中的关键帧,检测视频帧中文本的所在位置,识别视频帧中文本的内容。 不知道大家有没有做笔记的习惯,这个开源项目就很方便的把你一个视频中的字幕提取出来&…...
WebSocket与Shiro认证信息传递的实现与安全性探讨
在现代Web应用程序中,WebSocket已经成为实时双向通信的重要组件。而Shiro作为一个强大的Java安全框架,用于处理身份验证、授权和会话管理。本文将探讨如何通过WebSocket与Shiro集成,实现认证信息的传递,并关注在这一过程中确保安全…...
QT 实现自动生成小学两位数加减法算式
小学生加减法训练 QT实现–自动生成两位数加减法算式,并输出txt文件 可以copy到word文件,设置适当字体大小和行间距,带回家给娃做做题 void MainWindow::test(int answerMax, int count) {// 创建一个随机数生成器QRandomGenerator *gener…...
小程序学习-20
建议每次构建npm之前都先删除miniprogram_npm...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
