utf-8@Python


with open('1.txt',"w") as fff:
    print(fff)

测试print()函数的file参数时,不小心弄出来一个<_io.TextIOWrapper name='1.txt' mode='w' encoding='cp936'>
才知道原来‘GB2312’原来是系统中第936号编码格式。

windows的PS默认codepage是CP936,除此之外还有cp950 繁体中文、cp932 日语、cp1250 中欧语言,通过命令chcp 65001可以修改默认编码为utf-8,即65001号活动代码页,但是再次运行那段代码,仍然显示encoding='cp936',怎么弄才能默认国际化呢……(不知道,后文也与此问题无关)

参考:https://www.cnblogs.com/fnlingnzb-learner/p/6163205.html

"其实Unicode涉及到两个步骤,首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,可以跟计算机没半毛钱关系.第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间."

第一个步骤:char(int), ord(char)
第二个步骤:str.encode(encoding='UTF-8',errors='strict'), bytes.decode(encoding='UTF-8',errors='strict')

历史

ASCII

American Standard Code for Information Interchange,美国信息交换标准码。
7 bits(字符,8bits是一个字节byte) 表示128个文字符号(为了与bit相区别,后文简称问文符)。
被IBM公司扩展后,用8bit来表示每一个文符,总共可以表示256个文符。也就是当第一个bit是0时仍表示之前那些常用的文符;当为1时就表示其他补充的文符。

unicode

Unicode和ISO这样的组织来统一制定的标准。
ISO取名叫UCS(Universal Character Set),Unicode取名就叫unicode了。(爹妈各叫各的)
unicode的第一个版本是用两个字节(16bit)来表示所有文符
1996年开始又来了第二个版本,用四个字节表示所有文符。这样就出现了UTF-8,UTF16,UTF-32,原理和之前肯定是完全一样的,UTF-32就是把所有的文符都用32bit也就是4个字节来表示。然后UTF-8,UTF-16就视情况而定了。UTF-8可以选择1至8个字节中的任一个来表示,而UTF-16只能是选两字节或四字节。
目前 Unicode 5.0 收录的文符已经达到99024,已超过 UTF-16 的存储范围;

UTF

unicode transformation format,unicode的交换格式。

UTF-16

用16字符2字节,或者32字符4字节,表示一个文符。可能是最初的UTF
UTF-16不需要用啥字符来做标志。所以两字节也就是2的16次能表示65536个文符。

UTF-8

可变了,实际上是用可以选择1至8个字节(8-64字符)来表示一个文符
UTF-8由于里面有额外的标志信息,所有一个字节只能表示2的7次方128个文符;两个字节只能表示2的11次方2048个文符;而三个字节能表示2的16次方,65536个文符。
由于"汉"的编码27721大于2048了所有两个字节还不够,只能用三个字节来表示。
UTF-8在局部的字节错误(丢失、增加、改变)不会导致连锁性的错误,因为 UTF-8 的字符边界很容易检测出来,所以容错性较高。

如果全部英文或英文与其他文字混合,但英文占绝大部分,用UTF-8就比UTF-16节省了很多空间,因为英文的UTF-8和ASCII占用的空间是一样的,而如果全部是中文这样类似的字符或者混合字符中中文占绝大多数.UTF-16就占优势了,因为中文的UTF-8需要用3字节,而UTF-16占2字节。
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, big endian
FF FE     UTF-16/UCS-2, little endian
FF FE 00 00  UTF-32/UCS-4, little endian.
00 00 FE FF  UTF-32/UCS-4, big-endian.

就原文来说,UTF-8和UTF-16各有优缺点,但我觉得就容错率一点来说,UTF-8就占有绝对优势,毕竟计算机和互联网的容量和速度都在不断地赶超人脑瓶颈(好吧,就是我的脑瓶颈),基本不需要再从编码上节约了,而出错总是难免的。

posted @ 2023-04-13 13:22  etfolin  阅读(39)  评论(0编辑  收藏  举报