目 录

  • 概念
  • ASCII,ISO8859-1,GBK,GB18030,Unicode,UTF-8详解
  • 乱码的原因
  • Java代码为例说明乱码

概念

  计算机只认识0101这样的二进制字节,而人天生只对a,b.c,中,大这些字符敏感,而且写代码的目的是为了让计算机能读懂,主题是计算机,所以自然就衍生出了两个概念,如图1;

  • 编码(encode): 从字符到字节;
  • 解码(decode): 从字节到字符;

  那解码和编码也不能瞎解,瞎编吧,必须要有规范的对照的转化字典表吧,因为世界各地语言存在差异,编码和解码的工作也就不一样,就出了不同的字符集编码解码大字典,如 ASCII,ISO8859-1,GBK,GB18030,Unicode,UTF-8;

图1 编码和解码概念

ASCII,ISO8859-1,GBK,GB18030,Unicode,UTF-8详解

  程序中经常遇到乱码的问题,产生的乱码的原因就是因为计算机直接存储字符,需要将字符转化为二进制的,不同的转化规则就对应了不同的编码方式,而保持不乱的条件就是编码方式和解码方式保持一致,今天就一起阅尽天下编码,心中自然无码。
  首先先来看一眼编码的发展历程图,如图2:

图2 字符集编码发展历程

ASCII:首先大家都知道计算机由美国人发明,那ASCII码正是最早用来将127字符的编码到计算机里面的一套编码;
ISO8859-1:ASCII的扩充,可以编码一些较为生僻的拉丁字符;
GB2312:当计算机来到中国,ISO8859-1显然就不够用了,存储不了我们伟大的汉字,最找也有提出将汉字转化为拼音存入计算机的想法,但经过国人的不屑努力,开发出了GB2312的国内最早,用得最多的简体中文编码;
BIG5:与此同时港澳台同胞开发了BIG5来编码繁体汉字;
GBK:GB2312的扩充,把BIG5码的思想融入进来,既可以表示简体中文也可以表示繁体中文;
GB18030:GBK的扩充,可以表示少数民族的字符,现在的国标码;
Shift_JIS/Euc_kr:深受我大中华文化熏陶的周边国家日本,韩国方块象形字,在计算机引进后一样遇到了这样的问题,就自己开发了各自的国标码;
Unicode:每个国家都来一套国标码,那大家还怎么记?最重要跨国合作项目还做不做?因为大家的项目编码不同的话一样遇到乱码的,于是天下大事分久必合,Unicode诞生了;
UTF-8:Unicode已经满足要求了啊,为啥还有UTF-8,那是因为Unicode使用2个字节,但对于老美的字母存储来说,一个字节完全够用,用Unicode强行加大存储负担,本来ASCII码,1T的内容,强行被Unicode整出了2T,但是现在中,日,韩等象形字国家这么多,老美又避免不了和他们网络交流,于是UTF-8可变长的编码就诞生了,UTF-8,一个字节表示字母,3个字节普通汉字,4~6个字节表示生僻字;
UTF-16:定长,两个字节的unicode,分为大端(高段位地址)和小端(低段位地址),FF PE表示小端,FE FF表示大端;
  下表是常用的编码和表示汉字或字母时的字节数:

编码 字母 汉字
ISO8859-1/ASCII 1个字节 无法表示
GBK/GB18030/Unicode 2个字节 通常的2个字节(生僻字4个字节)
UTF-8 1个字节 通常的3个字节(生僻字4~6个字节)

乱码的原因

  综上所述,乱码的原因一般就两个;

  1. 编码解码字符集不一致;

常人遇到的一般是这种,只需要另存为一下换成对应的字符集即可解决;

  1. 编码解码字符集一致了,但是该字符集所要覆盖的字节长度没有得到满足,发生了截断;

程序员处理程序有bug所致,需要给到适应的字节长度;

Java代码为例说明乱码

package cm.rowyet.Test17IO;import java.io.UnsupportedEncodingException;public class FileDemo06 {public static void main(String[] args) throws UnsupportedEncodingException {String msg="a,努力努力再努力!";System.out.println("---------------------编码后字节数----------------------------");//编码,字节数组byte[] datas=msg.getBytes(); //使用默认工程的字符集 默认为UTF-8System.out.println(datas.length);System.out.println("---------------------解码后字符----------------------------");System.out.println();//正确解码//String(byte[] bytes,int offset, int length,String charsetName);//byte[] bytes 字节数组;//offset 开始解析的位置//length 字节长度//charsetName 字符集msg=new String(datas,0,datas.length,"utf8");System.out.println(msg);System.out.println("---------------------字节数不够导致的解码乱码----------------------------");//乱码 字节数不够msg=new String(datas,0,datas.length-1,"utf8");System.out.println(msg);msg=new String(datas,0,datas.length-2,"utf8");System.out.println(msg);System.out.println("---------------------字符集不统一导致的解码乱码----------------------------");//字符集不统一msg=new String(datas,0,datas.length,"gbk");System.out.println(msg);}}

  输出结果为:

---------------------编码后字节数----------------------------
24
---------------------解码后字符----------------------------a,努力努力再努力!
---------------------字节数不够导致的解码乱码----------------------------
a,努力努力再努力
a,努力努力再努�
---------------------字符集不统一导致的解码乱码----------------------------
a,鍔姏鍔姏鍐嶅姫鍔�!Process finished with exit code 0

ASCII,ISO8859-1,GBK,GB18030,Unicode,UTF-8详解相关推荐

  1. 编码全解:从ASCII/ISO-8859/GB2312/GBK到Unicode的UCS-2/UCS-4/UTF-8/UTF-16/UTF-32

    1.ASCII编码 为了能在电报.打印机.计算机等电信设备上进行信息交换,就必须为不同的设备制定统一的编码格式.早期的电信设备字符编码基本都是使用6位编码.1963年美国国家标准协会(ANSI)制定并 ...

  2. Unicode双向算法详解(bidi算法)(二)

    作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...

  3. Unicode双向算法详解(bidi算法)(一)

    Unicode双向算法详解(bidi算法)(一) 注:本文已独家授权给脚本之家(ID:jb51net)公众号发布 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是 ...

  4. Unicode双向算法详解(bidi算法)(三)

    Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...

  5. 细说ASCII、GB2312/GBK/GB18030、Unicode、UTF-8/UTF-16/UTF-32编码

    参考: <编码标准-GB2312 GBK GB18030> <字符编码笔记:ASCII,Unicode 和 UTF-8> <字体编辑用中日韩汉字Unicode编码表> ...

  6. python初级6(九九乘法表,二进制,ASCII编码,GBK,unicode,utf-8)

    九九乘法表 for i in range(1,10):for j in range(1,i+1):print(f"{i}*{j} == {i*j}",end=" &quo ...

  7. 各种编码格式(GB2312,GBK,GB18030,unicode,utf-8)之间的关系

    汉字常用编码格式 为了在屏幕上显示字符.需要下面几个步骤: 制作所有字符对应的字模.比如大写字母A长什么样.这个模样就是最终显示在屏幕上图形,即我们看到的字符A. 为对所有的字符进行编码.比如大写字母 ...

  8. Unicode与JavaScript详解 [很好的文章转]

    上个月,我做了一次分享,详细介绍了Unicode字符集,以及JavaScript语言对它的支持.下面就是这次分享的讲稿. 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的 ...

  9. 编码 GBK 的不可映射字符 (0x80),sublime设置中文,sublime没有GBK编码选项的问题详解

    文章目录 1.问题描述 2.问题分析 3.问题解决 3.1 sublime Text 3引入 3.1.1 介绍 3.1.2 特点 3.1.3 下载与安装 3.1.3.1 :house: 下载官网: h ...

最新文章

  1. 英伟达GPU“屠榜”,谷歌TPU“退赛”,MLPerf最新推理榜单出炉
  2. 锁死AI基础研究的两个「智子」是什么?
  3. 【计算理论】计算复杂性 ( 阶段总结 | 计算理论内容概览 | 计算问题的有效性 | 语言与算法模型 | 可计算性与可判定性 | 可判定性与有效性 | 语言分类 ) ★
  4. [答网友问]让GridLength支持动画
  5. Doker : Docker 容器与宿主机共享文件
  6. 人工智能TensorFlow工作笔记011---前向传播算法简介
  7. diy 单片机 自动浇花_造个自动浇花装置(完)
  8. linux 线程同步与互斥:互斥锁 多线程访问共享资源时,使用互斥锁进行控制
  9. jdk+jmeter下载安装教程
  10. php爬虫框架使用案例QueryList,将数据爬到mysql数据库
  11. 计算机丢失dll文件怎么弄,电脑开机提示dll文件丢失怎么办?
  12. No qualifying bean of type ‘com.zl.dao.UserDao‘ available:expected at least 1 bean which qualifies
  13. 物理Standby数据库的文件路径转换(1)
  14. Linux系统备份与还原-Clonezilla
  15. BacNet IP开发过程
  16. Mask Scoring R-CNN
  17. 向量数据库入坑:使用 Docker 和 Milvus 快速构建本地轻量图片搜索引擎
  18. Java面试系列——数据库(01)数据库的作用、分类、SQL语言、运算符
  19. 「Android渲染」图像是怎样显示到屏幕上的?
  20. angular 4 拼接url

热门文章

  1. Android辅助功能
  2. tomcat 严重: Could not contact localhost:80. Tomcat may not be running.
  3. 【Web前端】彼岸の花——网上花店(网页制作)
  4. 基于深度学习的恶意软件检测Python代码及数据
  5. 微信小程序:组件Component接收不到参数id
  6. 验证码研究入门必读(验证码是什么,有什么用,分类,设计,破解,未来发展)
  7. 【linux】【docker】docker私服安装
  8. linux输入法搜狗 修复,搜狗输入法自带修复功能,可以解决无法打字的问题
  9. ArcGIS案例学习笔记2_1
  10. win10关闭快速启动_win10系统快速启动的坏处