专题目录
本节知识体系编码的存储(BOM)在读取文件字节流的时候,怎么判断字节流的字节序,然后转换为字符的呢? Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符''零宽无中断空格''。 BOM(Byte Order Mark)字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。 文件的字符集在Windows下有两种:
对于Unicode,Windows支持了它的三种编码存储方式:
我们可以从文件的头部字节来区分一个文件是属于哪种编码,然后再进行解码操作:
如果你新建一个记事本,默认是按照ANSI存储的(前篇中介绍了ANSI),如果你另存为的话可以看到如下选择: 大端法(大尾)(Big-endian):
小端法(小尾)(Little-endian):
寄存器与内存映射读取的时候: 图片参考自维基百科 Unicode标准建议用BOM(ByteOrderMark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符''零宽无中断空格''。
但是微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节。 Windows下缺省是小端法,Windows平台为何默认使用小端法呢?说起来与CPU制造商英特尔(Intel)又有很大关系。
以一个整数0x0A0B0C0D为例: 图片参考自维基百科 编码的关系详细的可以结合本专栏系列文章的第二篇编码的历史。 各编码间转换各个编码之间要直接转换,两个字符集必须同时包含此字符互相转换才有意义,否乱码。 转换一般都是与Unicode字符集下面的各编码方式进行转换。 转换的原理一般是:
内存中的编码与物理存储的编码打开记事本,输入如下(你好的中文,日语,韩语的形式): 默认保存时按照ANSI保存的,我的系统是简体中文,所以默认编码格式是GB2312/GBK编码。 保存之后(保存的时候会提示你,包含Unicode编码的字符,是否保存),再次打开的时候,出现如下乱码: 我们会发现韩语乱码了(GBK等中文字符集收集兼容很多日语字符,可能为了以后做准备)。 再新建一个记事本,输入刚才的内容,保存的时候选择另存为,下面的编码选择UTF-8保存,保存之后,再次打开,发现不会乱码。 为啥什么会出现上面的情况?为啥不保存的时候不乱码? |
|