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-1String 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帅锅

  

转载于:https://www.cnblogs.com/ysocean/p/6850811.html

Java 字符编码与解码相关推荐

  1. java中的解码和编码_关于java中编码和解码(一)

    关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...

  2. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  3. java字符编码方式总结

    java字符编码方式总结一.概要在JAVA应用程序特别是基于WEB的程序中,经常遇到字符的编码问题.为了防止出现乱码,首先需要了解JAVA是如何处理字符的,这样就可以有目的地在输入/输出环节中增加必要 ...

  4. Java字符编码知识简介

    1.基本信息 摘要:在Java应用程序特别是Web应用中,经常遇到字符的编码问题.为了防止出现乱码,首先需要了解字符编码的基本概念以及Java是如何处理字符编码的,这样就可以有目的地在输入/输出环节中 ...

  5. java字符串编码和解码

    java字符串编码和解码 记录原因:因为Windows和Linux操作系统默认编码的不同( Windows的默认编码为GBK,Linux的默认编码为UTF-8),导致项目中出现了乱码问题,故此记录一下 ...

  6. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode...

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  7. android Java BASE64编码和解码二:图片的编码和解码

    1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...

  8. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  9. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

最新文章

  1. php进程通讯 windows,windows-server-2008 – PHP进程一次运行一个,总是占用一个核心的100%...
  2. 项目经理的超越(三)人际优先,做事上的超越
  3. 应用语言学 计算机语言学,应用语言学的名词解释
  4. php 安全设置总结。
  5. 如何给Docker hub用户上传头像
  6. NSEnumerator使用
  7. 关联容器——map、set
  8. 【React】添加新组件
  9. 走进波分 -- 15.Optix OSN1800产品介绍
  10. 写代码的时候图片显示不出来怎么办?
  11. 不使用BHO监控IE窗口事件
  12. postman支持https、安卓抓包
  13. Linux上传GitHub【超详细】
  14. 戴尔计算机专业推荐笔记本电脑,戴尔笔记本推荐
  15. 网络异常处理,ping测试报:一般故障
  16. 使用yolov3训练识别围棋死活题和围棋局面
  17. 锚点定位 跳转到指定位置 回到顶部功能
  18. 小岛上的蓝眼睛的人要几天才能全部离开
  19. 马化腾豪掷千金,张一鸣爱而不得:这家美国公司要独立上市了
  20. 裕奥在线ER模型设计数据库实战

热门文章

  1. 带你自学Python系列(十二):Python函数的用法(二)
  2. (转)C++ main函数中参数argc和argv含义及用法
  3. java 微信证书文件,CertificateDownloader
  4. 将已有项目转为se项目_威海将再添国家级非遗项目
  5. 地区的json数据_数据密集型系统基础:数据模型与查询语言
  6. spring的事务隔离_spring事务基础及常见问题详解
  7. 大一计算机考试题库知识点,大一 计算机基础 期末考试题库
  8. opencv4.4.0函数手册_【文档更新】发布100ask_imx6ull用户手册V2.0和全新烧写工具
  9. 【小程序】当前“页面B”动态更改title,点击返回按钮,更改的标题会显示在“来源页面A”...
  10. Windows下Python3+nose+appium自动化测试之Android篇