BY_Dark_Wind 发表于 2020-4-1 22:52

问个问题,txt是怎么确定中英文字符的呢

最近发现一个问题,比如说一个txt文件
当输入1个英文字符的时候,大小是1个字节
当增加中文字符的时候,unicode编码只增加了2个字节,utf-8增加了三个字节
就是说即使中英文混合的时候,txt也能在没有任何标记的情况下区分出接下来读取的是中文字符还是英文字符,并读取对应的字符数,这是怎么做到的呢?

xuyincheng 发表于 2020-4-2 11:26

这跟文件没关系吧,编码决定的吧!

BY_Dark_Wind 发表于 2020-4-2 13:54

我之前的理解是英文字符或者数字占用的空间也是随编码变化的
unicode是2个字节,utf-8是3个字节
但是我发现实际并不是这样的,即使以utf-8编码保存的txt文档,英文字符也只占用1个字节,这是为什么呢?txt文档是如何区分中英文字符的呢?

天黑我隐身 发表于 2020-4-2 14:33

首先文件解码是逐字节读取的,utf8使用1~4个字节来表示一个字符,解决读取的下一个字符到底占几个字节其实很简单
在utf8设计思路里,一个字节是会存储是否需要额外字节参与解码的信息的
---------------|---------------------------------------------
占一个字节 | 0xxxxxxx
占两个字节 | 110xxxxx 10xxxxxx
占三个字节 | 1110xxxx 10xxxxxx 10xxxxxx
占四个字节 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
即一个字节的前面有几个标记为是1,那么就需要几个字节参与解码
所有中文字符都在1110xxxx 10xxxxxx 10xxxxxx这个范围内,而这些对剩下的x位进行16进制转换后就得到unicode编码
举个
栗子,汉字“我”对应的unicode编码是\u6211,对其16进制转二进制得到'0b110001000010001'
在存储的时候占3个字节,存储为 11100110 10001000 10010001
解码过程就是编码的逆运算
从存储结果去掉红色的标记位就得到0110001000010001,转换成16进制就是'0x6211'
页: [1]
查看完整版本: 问个问题,txt是怎么确定中英文字符的呢