分享

05.编码番外篇-图解base64编码,BOM,转换,关系等

 xiejunxy 2019-02-06

专题目录


  1. 小故事阐述编码原理
  2. 从编码的纵横历史理解计算机编码,以史鉴理
  3. 详解编码原理——编码学上部分
  4. 详解编码原理——编码学下部分
  5. 编码番外篇-图解base64编码,BOM,转换,关系等

本节知识体系


编码的存储(BOM)


在读取文件字节流的时候,怎么判断字节流的字节序,然后转换为字符的呢?

Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符''零宽无中断空格''。

BOM(Byte Order Mark)字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。

文件的字符集在Windows下有两种

  1. 一种ANSI
  2. 一种Unicode。

对于Unicode,Windows支持了它的三种编码存储方式

  • 一种是小尾编码(Unicode),
  • 一种是大尾编码(BigEndianUnicode),
  • 一种是UTF-8编码

我们可以从文件的头部字节来区分一个文件是属于哪种编码,然后再进行解码操作:

当头部开始的两个字节为 FF FE时,是Unicode的小尾编码 (UTF-16 LE);

当头部的两个字节为FE FF时,是Unicode的大尾编码(UTF-16 BE);

当头部两个字节为EF BB BF时,是Unicode的UTF-8编码;

当头部两个字节为00 00 FE FF时,是Unicode的 UTF-32大尾编码;

当头部两个字节为FF FE 00 00时,是Unicode的UTF-32小尾编码;

当头部它不为以上的时候,则是ANSI编码。

如果你新建一个记事本,默认是按照ANSI存储的(前篇中介绍了ANSI),如果你另存为的话可以看到如下选择:

大端法(大尾)(Big-endian):

那么我们发现,就单个编码而言,高位的字节反而放到了低地址上,而低位的字节却放到了高地址上,就是按照从左到右存储。

小端法(小尾)(Little-endian):

现在它的高低字节反而与地址的高低位自然地对应上了,就是按照从右到左存储。

寄存器与内存映射读取的时候:

图片参考自维基百科

Unicode标准建议用BOM(ByteOrderMark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符''零宽无中断空格''。

对于UTF-8来说BOM标记的有无并不是必须的,是可选的。因为UTF8字节不区分大小端,在UTF-8编码中,其自身已经带了控制信息,如1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx,其中1110就起到了控制作用,所以不需要额外的BOM机制,所以不需要标记.

但是微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节。

Windows下缺省是小端法,Windows平台为何默认使用小端法呢?说起来与CPU制造商英特尔(Intel)又有很大关系。

内存(Memory)中使用端法其实又是受到寄存器(Register)中使用的端法的影响,因为两者之间经常要来回拷贝数据。英特尔的CPU就使用了小端法。

以一个整数0x0A0B0C0D为例:

图片参考自维基百科

编码的关系


详细的可以结合本专栏系列文章的第二篇编码的历史。

各编码间转换


各个编码之间要直接转换,两个字符集必须同时包含此字符互相转换才有意义,否乱码。

转换一般都是与Unicode字符集下面的各编码方式进行转换。

转换的原理一般是:

  1. 根据当前编码,逆转解码找到当前编码在当前字符集里面代表的字符,
  2. 根据此字符,去待转编码的基字符集里面查找,对应的此字符的字符编号,
  3. 然后,在按照待转的编码方式,把字符编号转换为对应的二进制码。

内存中的编码与物理存储的编码


打开记事本,输入如下(你好的中文,日语,韩语的形式):

默认保存时按照ANSI保存的,我的系统是简体中文所以默认编码格式是GB2312/GBK编码。

保存之后(保存的时候会提示你,包含Unicode编码的字符,是否保存),再次打开的时候,出现如下乱码

我们会发现韩语乱码了(GBK等中文字符集收集兼容很多日语字符,可能为了以后做准备)。

再新建一个记事本,输入刚才的内容,保存的时候选择另存为,下面的编码选择UTF-8保存,保存之后,再次打开,发现不会乱码。

为啥什么会出现上面的情况?为啥不保存的时候不乱码?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多