文章标题

  • 一: 编码江湖之初恩怨
  • 二: 编码江湖之"乱码"家族
  • 三: 江湖规则之基础知识
    • Bit(位)
    • Byte(字节)
    • 字符
    • 字符集
    • 字符编码
    • 字符集与字符编码的区别
    • 查看电脑默认的字符编码
    • 编码和解码的由来
    • 编码和解码
    • 常见的字符集
    • (一)ASCII字符集和ASCII编码
    • (二)GBXXXX字符集
    • (二)Unicode字符集
  • 四:举例说明编码与解码的过程
  • 五:乱码出现的原因
  • 六:解决乱码
  • 七:经常遇到的乱码场景与解决
    • 一:IDEA工具出现乱码
    • 二:Mysql数据库乱码和编码设置
  • 八:参考和感谢
  • 九:总结

   温馨提示: 本文大约6500字,阅读完大概需要3-5分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,您的意见对我非常宝贵,再次感谢你阅读本文。

一: 编码江湖之初恩怨

一: 编码江湖之初恩怨

  在编码的江湖中,"乱码"算得上我们遇到的最难缠的"敌人"之一,一旦遇上、轻则心情烦躁、重则心态崩溃。文章开头,让我们再次重温与"乱码"初见面的名场面。

String str = "乱码,你好";
byte[] bytes = str.getBytes("GBK");
String string = new String(bytes,"UTF-8");
System.out.println(string);

  运行结果:

  是不是感觉很熟悉,这个是出现乱码最简单的例子,虽然在编程时我们肯定不会这样写,但是,乱码出现的原因都是相通的,想要知道为什么?那就继续我们的"乱码"江湖的闯荡吧。

二: 编码江湖之"乱码"家族

二: 编码江湖之"乱码"家族

  想要从根本上铲除"乱码"这个敌人,我们就必须对它的生命历程有清楚的认识,正所谓:“知己知彼,才能百战不殆”。

  (一)“乱码"产生的原因:

  在编码江湖中,我们想要生存下来,首先得懂得这个江湖的规则,计算机就是我们闯荡的编码江湖,但是,计算机的规则约定: 它们只能够读懂二进制数0和1,我们能够表达的确实对应的字符,为了在编码程序中生存下来,我们需要一种技术能够将我们表达的字符转换成对应计算机能够读懂的二进制数0和1,这种技术就叫编码,但是,因为闯荡这者的不同,所表达的字符就存在差异,所以针对不同的闯荡地区,存在不同的编码,如果不是同一个地区使用了其他地区的编码方式进行转换,就会出现"乱码”,计算机就会看不懂。

三: 江湖规则之基础知识

三: 江湖规则之基础知识

想要在计算机世界行走江湖,就必须对这个世界的基础概念有个清晰的认识,下面就讲解关于计算机世界的基础知识讲解:

Bit(位)

计算机世界的最小存储单位,也是计算机能够读懂的,可取的值是0或1,每个值就标识1位,如:0000 0001表示的就是8位,转换成我们认识的数值(十进制)就是1。

Byte(字节)

计算机世界中的一种表示存储容量的单位,1Byte = 8Bit,即一个字节可以存储8位,除了Byte外,计算机还有以下常用的存储容量单位以及他们之间的转换关系:

1Byte = 8bit
1KB(KByte) = 1024Byte = (1024 * 8)bit
1MB(MByte) = 1024KB =(1024 * 1024)Byte = (1024 * 1024 * 8)bit
1GB = 1024MB =  (1024 * 1024)KB =(1024 * 1024 * 1024)Byte = (1024 * 1024 * 8)bit
1T = 1024GB = (1024 * 1024)MB =  (1024 * 1024 * 1024)KB =(1024 * 1024 * 1024 * 1024)Byte = (1024 * 1024 * 1024 * 8)bit
字符

字符也就是我们在计算机表达的"语言",常见的包括:数值、字母、文字和符号,如:1、a、A、试、$…都表示的是一个字符,在计算机世界中,不同的字符可能需要不同的存储容量进行存储。

字符集

集:表示集合,字符集则表示多个字符的集合,每个字符集可以包括不同的字符,常见的字符集如下:

ASCII字符集
GB2312字符集
Unicode字符集
字符编码

定义: 将字符集中的字符编码(映射)成集合中的某一个对象如:比特模式、自然数序列、电脉冲等,以方便字符在计算机中存储和在计算机网络中传递

字符集与字符编码的区别

字符集表示:多个字符的集合,字符编码则是:将字符集中的字符映射为特定的字节或者字节序列,它表示的是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码,如: ASCII、ISO-8859-1、GB2312、GBK都是表示了字符集又表示了对应的字符编码,但Unicode字符集是特例,它对应的字符编码有:UTF-8、UTF-16、UTF-32)

查看电脑默认的字符编码
1、打开控制台(win+R),输入cmd回车
2、右键菜单栏选择属性
3、当前代码页就是对应的字符集编码



编码和解码的由来

  计算机的世界中,它只能懂得0和1(即二进制),但是,我们交流的时候是通过字符进行交流,所以,如果想要计算机了解我们想表达的东西,以及我们想了解计算机想表达的东西,就需要在字符和0与1之间进行转换,也就是: 编码和解码

编码和解码

 就编码和解码而言,针对的是我们(即在计算机中闯荡的人),这样就不会混淆这两个概念。

 编码: 将字符按照对应的编码类型转换成计算机能够识别的0或者1(类似于生活中的:将中文翻译成英文的翻译官)

 解码: 将0和1根据对应的解码类型转换成我们能够读懂的字符(类似于生活中的: 将英文翻译成中文的翻译官)

常见的字符集

 ASCII、GB2312、Unicode、GBK等

(一)ASCII字符集和ASCII编码

ASCII字符集: 全称《美国信息交换标准代码》,主要用于显示现代英语和其它西欧语言,主要包括:可显示字符(英文字母、阿拉伯数值、标点符号)、以及控制字符(回车、换行、退格等特殊字符)。

ASCII编码: 美国定制的交换标准,目的是将ASCII字符集包含的字符转换成计算机能够识别的二进制(0和1),它是最通用的信息交换标准,到目前为止总共定义了128个字符。

ASCII编码缺点: 只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则),而且对其他的语言支持力度也不大,所以现在苹果也使用Unicode替换ASCII。

(二)GBXXXX字符集

 (1) GB2312字符集:

  • 全称:《信息交换用汉字编码字符集》,刚开始ASCII字符集只包含了阿拉伯数字、字母和一些特殊符号,这个编码只适用于美国和西方的一些国家,而不适用于使用汉字的国家,为了使用汉字的国家也能够和计算机进行沟通,中国国家标准总局发布了标准号为:GB2312的编码格式,它适用于汉字处理、汉字通信等系统之间的信息交换,除了中国大陆使用外,新加坡等地也采用此编码。
  • GB2312字符集共收录了6763个简体汉字,它的收录包括了拉丁字母、日文平假名等在内的682个全角字符,GB2312编码可以将GB2312字符集包含的字符转换成计算机能够识别的二进制0和1。

(2)GBK字符集

  • 全称:《汉字内码扩展规范》,因为GB2312字符集编码只支持简体汉字和一些特殊符号,繁体字和一个特殊简体字都没有收录其中,所以微软针对GB2312做了拓展,在GBK字符集中收录了繁体字,并最早在Window95简体中文版使用。
  • GBK拓展了GB2312字符集,共收录了两万多个文字,GBK编码可以将GBK字符集收录的字符转换成计算机能够识别的二进制0和1。

(3)GB18030字符集

  • 全称: 国家标准GB 18030-2005《信息技术 中文编码字符集》,因为GBK是由微软首先制定的,并不属于国家标准,所以国家为了兼容GBK字符集制定了GB18030字符集,它是中华人民共和国现时最新的内码字集,除了兼容GBK字符集外,还支持GB 13000及Unicode字符集的全部统一汉字。
  • GB 18030字符集共收录汉字七万多个,并且存储方式采用的是可变长字节编码,每个字可以由1个、2个或4个字节组成。
(二)Unicode字符集
  • Unicode字符集的出现: 当计算机出现在全球各地时,为了与计算机进行交流,指定了各种各样的标准如GB232/GBK/GB18030/BIG5的编码方案,如果只在符合对应标准的地区使用则完全没有问题,但是如果通过网络与其他的地区进行交流时,因为各地的编码的标准都不一样,就会在转换中出现"乱码"现象,为了解决这个问题,Unicode字符集应运而生。
  • Unicode也称为: 统一码/万国码/单一码,它是业界的一种标准,通过它计算机可以实现世界上不同地区数十种文字的显示,2005年Unicode就已经收录了超过十万个字符,现在由Unicode组织进行管理运作。
  • Unicode编码系统为表达任意语言的任意字符而设计,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
  • Unicode编码标准现在有三种具体实现,分别是:UTF-8、UTF-16、UTF-32。

(1) UTF-8字符编码:

  • 它是实现了Unicode编码方案的一种可变长字符编码(定长码),也是一种前缀码。
  • 它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。
  • UTF-8已经逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
  • 互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。
  • UTF-8编码使用一至四个字节为每个字符编码(其中ASCII字符集中的128个字符只占1字节,还有附加符文的拉丁文、希腊文等需要2个字节,其他常用的文字占用3个字节,还有极少数的字符占用4个字节)。

(2) UTF-16字符编码:

  • 它是实现了Unicode编码方案的一种可变长字符编码(定长码)
  • 因为Unicode字符集中收录了很多字符,但是常用的一般不会超过65535个以外的字符,所以出现了UTF-16(2字节=16位)。
  • UTF-16优点: 它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。
  • UTF-16缺点: 不兼容ASCII。

(3) UTF-32字符编码:

  • 它是实现了Unicode方案的一种定长字符编码。
  • 它使用4个字节的数字来表示每个字母、符号,或者表意文字(ideograph)。
  • 优缺点: 使用4个字节存储每个字符,效率高,处理速度快(因为不用计算需要几个字节进行存储),但是浪费空间。
四:举例说明编码与解码的过程

四:举例说明编码与解码的过程

通过上面的基础规则学习,我们已经对字符集、编码、解码等基础知识有了基本的认识。现在我们就通过图形化来举一个例子更加形象理解的这些知识(以:ASCII字符集为准,用我们编程入门的最常见的字符串:hello world为例子)

编码: 在屏幕输入文字 -> 根据指定编码类型 -> 将输入的文字编码成计算机能够识别的二进制数 -> 计算机存储编辑成的二进制数值

解码: 计算机读取存储的二进制数值 -> 根据指定的解码类型解码 -> 将二进制数值解码成字符集中表达的字符 -> 在屏幕显示

五:乱码出现的原因

五:乱码出现的原因

通过上面的例子,我们能够更加清楚编码和解码的过程。同时,也看出了乱码出现的原因:

  • 编码过程和解码过程使用的编码方式不一致

  • 编码/解码对应的字符集不存在对应的字符

六:解决乱码

六:解决乱码

 知道出现乱码的两个原因,要解决乱码就要同时满足以下两个条件:
 1. 编码过程和解码过程使用同一种编码方式
 2. 使用支持需要编码解码的字符串对应的字符集

七:经常遇到的乱码场景与解决

七:经常遇到的乱码场景与解决

一:IDEA工具出现乱码

  File -> setting -> 输入File encoding -> 设置成对应的字符集

二:Mysql数据库乱码和编码设置

 通过控制台登录到mysql后。

  • 查询当前默认的数据库编码方式:
show variables like 'character_set%'

  • 设置数据库编码方式
//当前会话,退出控制台后又恢复回原来默认的编码方式
set character_set_server=utf8;
set character_set_database=utf8;//全集范围,无论是否退出控制台,以后都是使用这个编码方式
set global character_set_database=utf8;
set global character_set_server=utf8;
八:参考和感谢

八:参考和感谢

  1、w3c网站-字符集和字符编码(Charset & Encoding)
  2、乱码的产生和解决

九:总结

九:总结

  相信看到这里,你对乱码的会有了更深的认识,学习一个知识,只有知道这个知识的原理,才不会感觉一知半解。

  感谢你阅读本文,如果你觉得文章哪里存在错误,欢迎私信或者在下方留言指出。如果你觉得本文对你有一些帮助,可以给我一个点赞和关注,让我有更多动力给大家带来更多的文章,谢谢

关注公众号【是秘密呀joy】架构师视频、技术文章、面试资料、IDEA工具免费分享,不定时抽奖,只等你来!

全网最全面、全详细的编码、解码知识!!!相关推荐

  1. 中日文字编码转换_全网最全面、全详细的编码、解码知识!!!

      温馨提示:  本文大约4282字,阅读完大概需要3-5分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什 ...

  2. 全网史上最详细全面的Linux下安装mysql客户端服务端

    全网史上最详细全面的Linux下安装mysql客户端服务端Linux下安装mysql 1.上传MySQL5.6的tar包 创建目录: mkdir /usr/local/src/mysql5.6 上传: ...

  3. Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码(全)

    为了一个gb2312下post中文参数到utf-8页面的程序,随闷的难受,查了一下午资料,大部分是讲Gb2312传到Gb2312页面的UrlEncode,没有提供到Utf-8页面的UrlEncode, ...

  4. ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...

    墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门.索引管理.映射详解,本文详细介绍ElasticSearch的索引别名.分词器.文档管理.路由.搜索详解. 一.索引别名 1. ...

  5. 高速串行通信常用的编码方式-8b/10b编码/解码

    绪论 8b/10b编码/解码是高速串行通信,如PCle SATA(串行ATA),以及Fiber Channel中常用的编解码方式.在发送端,编码电路将串行输入的8比特一组的数据转变成10比特一组的数据 ...

  6. 音视频编解码知识学习详解(分多部分进行详细分析)

    1. 常用的基本知识 基本概念 编解码 编解码器(codec)指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序.这里指的变换既包括将信号或者数据流进行编码(通常是为了传输.存储或者加密)或 ...

  7. 基于频谱注意力机制和编码解码模型的时间序列分类研究

    文章来源 浙江大学 2021年硕士论文 小论文 IEEE Spectrum Attention Mechanism for Time Series Classification 1 摘要 本文贡献 时 ...

  8. gold matlab 编解码_JPEG编码解码(Matlab)

    搜索了网上的JPEG的matlab实现方式,发现只有寥寥几个,几乎都是只实现了一半,要么就是哈夫曼编码没有实现,要么就是只算出了哈夫曼的码长计算了一下效率,但是没有实际编码.要么就是太难我看不懂(汗. ...

  9. 行人重识别0-08:DG-Net(ReID)-代码无死角解读(4)-网络Es编码解码过程

    以下链接是个人关于DG-Net(行人重识别ReID)所有见解,如有错误欢迎大家指出,我会第一时间纠正.有兴趣的朋友可以加微信:17575010159 相互讨论技术.若是帮助到了你什么,一定要记得点赞! ...

最新文章

  1. 公开致铁道部 高效运营从细节入手
  2. 修改无效_解决docker部署gitlab时,clone地址无效和修改默认端口
  3. (十一)nodejs循序渐进-高性能游戏服务器框架pomelo之启动流程和组件
  4. 做系统ghost步骤图解_u盘装系统步骤
  5. 你见过哪些饭桌上不礼貌的行为?
  6. exp/imp 注释乱码问题或Oracle EXP-00091的解决方法
  7. Android CheckBox 实战
  8. .NET:OrderBy和ThenBy
  9. 字词拼音查询易语言代码
  10. linux 使用秘钥认证,linux 密钥验证登录
  11. MySQL服务器的超级管理员名称是_mysql服务器忘记了超级管理员root密码
  12. 百度给创新员工发2000w奖金........
  13. android对输入手机号码震动,浅析Android手机卫士之抖动输入框和手机震动
  14. matlab 直流无刷电机,无刷直流电机的matlab仿真.pdf
  15. 云计算工程师面试题集锦,云计算面试题及答案
  16. 【PowerDesigner】Mysql设计工具 16.5破解
  17. 员工信息表,增删查改程序
  18. 挑战程序设计竞赛: Subsequence
  19. 网页占满整个屏幕_CSS网页背景图片等比例占满整个页面的解决方案
  20. 用html语言编写勾股定理,HTML5 勾股定理动画演示

热门文章

  1. K-means和KNN
  2. 金融工程期末考试简答题
  3. 笔记本摄像头怎么开 不同笔记本的摄像头打开方
  4. linux inittab 时间,linux根文件系统制作之inittab启动分析
  5. naive-ui在setup引用message的方法
  6. 听惯了 QQ 音乐、酷狗音乐的你,想知道推荐模型到底是咋回事么?
  7. 20220323补卡-AC算法
  8. 快速排序java实现版
  9. R语言acres92 region_R语言作Circos图之进阶篇:圈圈套圈圈的法门
  10. Oracle处理CLOB超过4000入库问题 (2)