Java 字符编码与解码
1、字符编码的发展历程
①、ASCII 码
因为计算机只认识数字,所以我们在计算机里面的一切数据都是以数字来表示,因为英文字符有限,所以规定使用的字节的最高位是 0,每一个字节都是以 0-127 之间的数字来表示。比如 A 对应 65,a 对应 97。这便是 美国标准信息交换码,ASCII
String str = new String("Aa");
byte[] strASCII = str.getBytes("ASCII");
System.out.println(Arrays.toString(strASCII));//[65, 97]
②、GB2312 码
随着计算机在全球的普及,很多国家和地区都把自己的字符引入了计算机,比如汉字。此时发现一个字节能表示的数字范围太小,不能包含所有的中文汉字。那么就规定使用两个字节来表示一个汉字。
规定:原有的 ASCII 字符的编码保持不变,仍然使用一个字节表示,为了区别一个中文字符与两个 ASCII 码字符相区别。中文字符的每个字节最高位规定为 1(即中文的二进制是负数),这便是 GB2312 编码
String str = new String("Aa帅锅");
byte[] strASCII = str.getBytes("GB2312");
System.out.println(Arrays.toString(strASCII));//[65, 97, -53, -89, -71, -8]
③、GBK
由于中国汉字太多,在 GB2312 的基础上增加了更多的中文字符,这种编码是 GBK
问题:如果只是在中国,那么大家都认识汉字,但是如果是别的国家,而该国家的码表中是没有收录汉字的。那么计算机在显示的时候就为乱码或是别的字符
解决办法:为了解决各个国家因为本地化字符编码带来的影响,就把全世界所有的字符统一进行编码---Unicode 编码
此时某一个字符在全世界任何地方显示都是固定的,比如汉字 哥,在任何地方都是以十六进制 54E5 来表示。
Unicode 的字符编码都占有两个字节
④、UTF-8
是一种针对 Unicode 的可变长度字符编码,又称为 万国码,是 Unicode 的实现方式之一。编码中的第一个字节仍与 ASCII 兼容,这使得原来处理 ASCII 字符的软件无须或只需做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持 UTF-8 编码
String str = new String("Aa帅锅");
byte[] strASCII = str.getBytes("UTF-8");
System.out.println(Arrays.toString(strASCII));//[65, 97, -27, -72, -123, -23, -108, -123]
存储字母、数字:无论什么字符集都占有 1 个字节
存储汉字:GBK 家族占有 2 个字节。UTF-8 占有 3 个字节
不能使用单字节的字符集(ASCII/ISO-8859-1)来存储中文
2、字符的编码和解码
信息在计算机网络中传输是以字节的形式。那么如何变为字节?这就是编码的过程。那么计算机接收了这个编码,如何让使用者认识呢?那必须要将字节转换为人所识别的字符串形式,这就是解码的过程。
编码:将字符串转换为 byte 数组
解码:把 byte 数组转换为 字符串
注意:①、编码格式和解码格式必须一致,否则乱码
String str = new String("Aa帅锅");
//编码操作
byte[] strByte = str.getBytes("GBK");
System.out.println(Arrays.toString(strByte));//[65, 97, -53, -89, -71, -8]
//解码操作
//注意编码的字符集和解码的字符集格式必须一致(是其扩展字符集也可以),否则会乱码
//第一种:编码格式为 GBK,解码格式为 ISO-8859-1 那么就会乱码
String str2 = new String(strByte,"ISO-8859-1");
System.out.println(str2); //Aa?§??
//第二种:编码和解码格式一致
String str3 = new String(strByte,"GBK");
System.out.println(str3); //Aa帅锅
②、有时候编码为和解码格式一致了,但是还是乱码,这是因为在数据在传输过程中经过服务器的处理,而这个服务器可能是外国人编写的,那么就会将数据转换为 别的字符格式,那么你如果还是直接转为自己想要的格式是会乱码的。
解决办法:先获取经过服务器之后的数据还原编码,然后在进行解码
String str = new String("Aa帅锅");
//编码操作
byte[] strByte = str.getBytes("UTF-8");
System.out.println(Arrays.toString(strByte));//[65, 97, -27, -72, -123, -23, -108, -123]
//中间经过了服务器的传输,编码格式转成了 ISO-8859-1
String str2 = new String(strByte,"ISO-8859-1");
//解码操作 ,此时如果直接进行解码,那么会乱码
String str3 = new String(str2.getBytes(),"UTF-8");
System.out.println(str3); //Aa???????
//对于上面的乱码,我们必须先还原服务器之前的编码格式,然后在进行解码。那么就不会乱码
byte[] strByte2 = str2.getBytes("ISO-8859-1");
String str4 = new String(strByte2,"UTF-8");
System.out.println(str4); //Aa帅锅
Java 字符编码与解码的更多相关文章
- Java 字符编码(二)Java 中的编解码
Java 字符编码(二)Java 中的编解码 java.nio.charset 包中提供了一套处理字符编码的工具类,主要有 Charset.CharsetDecoder.CharsetEncoder. ...
- Java 字符编码(三)Reader 中的编解码
Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- Java 字符编码(一)Unicode 字符编码
Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...
- [19/03/28-星期四] IO技术_基本概念&字符编码与解码
一.概念 输入(Input) 指的是:可以让程序从外部系统获得数据(核心含义是“读”,读取外部数据) 常见的应用: Ø 读取硬盘上的文件内容到程序.例如:播放器打开一个视频文件.word打开一个do ...
- java字符编码详解
引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...
- JAVA字符编码三:Java应用中的编码问题
第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源: Eceel东西在线 问题研究--字符集编码 地址:http://china.e ...
- 【ABAP系列】SAP ABAP 字符编码与解码、Unicode
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 字符编码与解码 ...
- Kotlin/Java Base64编码和解码(图片、文件)
原文: Kotlin/Java Base64编码和解码(图片.文件) | Stars-One的杂货小窝 最近在项目中使用到了Base64编码和解码,便是稍微写篇文章记录一下 PS:本文代码都是使用Ko ...
随机推荐
- ASE加密
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- 51Nod 1289 大鱼吃小鱼 栈模拟 思路
1289 大鱼吃小鱼 栈模拟 思路 题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289 思路: 用栈来模拟 ...
- MySQL 性能优化的最佳20多条经验分享(三)(转)
16. 垂直分割 "垂直分割"是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段, ...
- React学习笔记--程序调试
React学习笔记 二 程序调试 前面我们搭建好了React的基本开发环境,可以编写基本的React js程序了.但完成的开发环境肯定包含调试器,怎么调试用React编写的JS程序呢?有浏览器,比 ...
- Redis入门篇
一.Redis简介: Redis(http://redis.io)是一款开源的.高性能的键-值存储(key-value store),它是用ANSI C来编写.Redis的项目名是Remote Dic ...
- 【Android源码解析】View.post()到底干了啥
emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决.但说实话,实在是太懒了,总感觉写 Handler 太麻烦了,一不小心 ...
- 更便捷的css处理方式-postcss
更便捷的css处理方式-PostCSS 一般来说介绍一个东西都是要从是什么,怎么用的顺序来讲.我感觉这样很容易让大家失去兴趣,先看一下postcss能做点什么,有兴趣的话再往下看,否则可能没有耐心看下 ...
- Java---实现邮件发送
实现发送邮件的发送必须有前提条件: 在qq邮件中开启POP3/SMTP服务,如下图所示(为本人邮件设置): 开启后会得到一个授权码.代码中会用到 需要的包: 百度网盘(包+源码):链接: https: ...
- JAVA设计模式之:命令模式
*通常情况下:行为请求者与实现者通常呈现一种高度耦合状态.有时要对行为进行变更处理处理.高度耦合方式就显得不合适. * 将行为请求者与行为实现者解耦,将一组行为抽象为对象.实现二者之间的松耦合. 这就 ...