首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

转:浅析windows下字符集和文件编码存储/utf8/gbk

  • 23-09-22 19:42
  • 4426
  • 14138
blog.csdn.net

最近老猿在学习文件操作及网络爬虫相关知识,发现字符集及编码的处理非常重要,而老猿原来对此了解并不多,因此找了几篇文章看了一下,将老猿认为比较的相关文章转载一下。感谢各位原创大神!

1,字符集

这里主要讲两种字符集,DBCS和UCS

DBCS即双字节编码字符集,最初的计算机只有ASCII码,发展至今,不能表示中文怎么办,于是中国人制定了GBK2312,以及后面陆续扩展并向下兼容的GBK,GB18030.

Unicode学名是“Universal Multiple-Octet Coded Chasracter Set”,简称UCS,他只兼容ANSI,为啥会有Unicode出现呢,因为在使用DBCS的时候,各个国家都有自己的一套字符集,于是非常的混乱的,不能正常显示所有字符,微软使用代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,后来国际组织决定指定一套全球统一字符集,就是Unicode了。

UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,

我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。

关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)

0000 – 007F 0xxxxxxx

0080 – 07FF 110xxxxx 10xxxxxx

0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx

UCS-2就是windows的宽字符,也就是utf16编码。

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,

用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

2,BOM

BOM是在一个文本文件之前,用来标记改文件编码方式的一种记录方式,windows下是这样做的,linux不知道。

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

假如文件用UTF8无BOM格式来保存文件,那就不能单纯的依靠BOM头来判断是否是utf8编码的,而要对文件中的数据进行简单的编码分析来确定文件的编码格式,也就是对文件的二进制进行分析,和对应编码的字符集进行匹配,最终确定其编码格式。

一个简单的小例子,用windows的notepad写一个文件,记录下“联通”两个字,关闭打开后,发现文件乱码了,为什么呢?就是文件编码是被错误导致的。

notepad存盘默认用的ansi编码,也就是对应gbk字符集。

联通的gbk字符集是“C1 AA CD A8”

C1 AA 对应的二进制: 1100 0001, 1010 1010

CD AB 对应的二进制: 1100 1101, 1010 1000

注意看红色的部分,刚好和上面UTF8的编码结构完全一致,因此才误将其认为是utf8无BOM编码的文件。可以使用notepad++打开来查看这个文件的编码格式,确实是UTF8无BOM格式。

ansi编码,ascii码用单字节ascii码值存储,非ascii码表内的,使用对应的dbcs字符集编码之来存储,因此同一个“汉字AB”对应的ansi编码存储的文件是 BA BA D7 D6 41 42

最后,统一看下。

"汉"字的gbk,utf8(有BOM),utf8(无BOM)utf16(小端),utf16(大端),二进制分别是

BA BA , EF BB BF E6 B1 89 ,E6 B1 89 , FF FE 49 6C , FE FF 6C 49

本文转自:
浅析windows下字符集和文件编码存储/utf8/gbk http://iyenn.com/index/link?url=http://seanyxie.com/a/jisuanjijichu/caozuoxitong/2019/0409/32.html

老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/96827845"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top