zoukankan      html  css  js  c++  java
  • 字符编码

    文本编辑器存取文件的原理

    1.打开编辑器就启动了一个进程,是在内存中的,所以用编辑器编写的内容也都是存放在内存中的,断电后数据丢失。

    2.要想永久保存,需要点击保存按钮,编辑器把内存的数据存到了硬盘上。

    3.在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。

    python解释器与文件本编辑的异同

    相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样。

    不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,会识别(语法)和执行python代码。

    字符编码

    最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系,最多只能用8位来表示(一个字节),即2**8=256,所以ASCII码最多只能表示256个符号。

    字符编码-ASCII表.jpg

    字符编码-总结字符编码发展史.png

    我们国家规定了自己的标准gb2312编码,规定了包含中文在内的字符与数字的对应关系。日本人规定了自己的Shift_JIS编码,韩国人规定了自己的Euc_kr编码,各个国家都有自己的编码,那这时候就必须统一编码了,于是Unicode应运而生。

    字符 ASCII Unicode UTF-8
    A 01000001 00000000 01000001 01000001
    x 01001110 00101101 01001110 00101101

    Unicode编码包含了所有国家的编码,而UTF-8是Unicode编码的延申,是为了节省内存空间。

    乱码分析

    首先明确概念:

    • 文件从内存到硬盘的操作简称存文件
    • 文件从硬盘到内存的操作简称读文件

    乱码的两种情况:

    1.存文件时就已经乱码

    存文件时,由于文件内有各个国家的文字,我们单以shift_js编码去存,本质上其他国家的文字由于在shift_js中没有找到对应关系而导致存储失败。当我们硬要存的时候,编辑并不会报错,但毫无疑问,不能存而硬存,肯定是乱存了,即存文件阶段就已经发生乱码,当我们用shift_js打开文件时,日文可以正常显示,而中文则乱码了。

    2.存文件时不乱码而读文件时乱码

    存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,比如gbk,则在读阶段发生乱码,读阶段发生乱码是可以解决的,选择正确的解码方式就好了。

    总结:

    1.保证不乱码的核心法则就是,字符按照什么标准编码的,就要按照什么标准解码,此处的标准是指字符编码。

    2.在内存中写的所有字符,一视同仁,都是Unicode编码,比如我们打开编辑器,输入一个“你”,我们不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能有很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定“你”到底是一个汉字,还是一个日本字,这就是Unicode转换成其他编码格式的过程了。简而言之,就是内存中固定使用的就是Unicode编码,我们唯一能改变的就是储存到硬盘时使用的编码。

    • Unicode---->encode(编码)---->gbk
    • Unicode---->decode(解码)<----gbk

    字符编码-utf8与Unicode转换.png

  • 相关阅读:
    activeMQ
    @Autowired与@Resource的区别
    maven工程下get的URI中带中文名称乱码解决
    linux下安装jdk
    Redis集群之Jedis的使用
    格式化Json数据
    拷贝chrome控制台打印的对象
    为什么有的代码容易理解,有的难
    ant design pro总是跨域,proxy也没设置错误,原来是浏览器缓存,清理Chrome缓存就可以了
    VScode:保存格式化问题,ESLint插件和编辑器本身冲突
  • 原文地址:https://www.cnblogs.com/gaohuayan/p/10932831.html
Copyright © 2011-2022 走看看