我们知道一般情况下文件内容越多,文件体积就会越大,占用的磁盘空间也会越大;具体到Windows的文本文档也就是TXT文档来看就是文件字数越多文件体积就越大。我很好奇,是不是可以根据文件大小算出文件里的字数或者根据字数算出文件大小?带着这个疑问我做了一个小实验,建了几个不同编码格式的文本文档并观察他们的大小。
结果证明TXT文件的字数和文件大小是能够简单互相计算的。
验证过程
新建不同编码格式的文本文档,并观察文件大小和占用空间。
空文件里没有写任何字符,英文字母文件里写了10000个字母,中文汉字文件里写了10000个汉字,从结果可以看出,各种编码的文本文档本身就占了不同的空间来标识编码格式。由于文件是以二进制形式存储的,以二进制查看文件,空文件里的内容如下(显示为十六进制):
可见不同编码格式的文本文档,标识位所占的字节数是不一样的。
字数 | ANSI | unicode | unicode big endian | utf8 | |
---|---|---|---|---|---|
编码标识位 | FFFE | FEFF | EFBBBF | ||
空文件 | 0 | 0/0 | 2/0 | 2/0 | 3/0 |
英文 | 10000 | 10000/12288 | 20002/20480 | 20002/20480 | 10003/12288 |
中文 | 10000 | 20000/20480 | 20002/20480 | 20002/20480 | 30003/32768 |
- 文件大小 / 占用空间,单位byte
- 由于电脑磁盘4k对齐,占用空间总是4096的整倍数
- 不同编码的文本,是根据文本的前两个字节来定义其编码格式的
下表是不同编码的编码标识位长度和中英文字符所占字节
类型 | 说明 | ANSI | unicode | unicode big endian | utf8 |
---|---|---|---|---|---|
编码标识位长度 | 0 | 2 | 2 | 3 | |
英文字符长度 | 英文字母、英文标点、半角空格 | 1 | 2 | 2 | 1 |
中文字符长度 | 中文汉字、中文标点、全角符号、全角字母、全角空格 | 2 | 2 | 2 | 3 |
结论
从表格可以看出:
1 | TXT文件大小 = 编码标志位长度 + 中文字符数 * 单个中文字所占字节数 + 英文字符数 * 单个英文字母所占字节数 |
- 单位为字节
- 【 中文字符数】指包括汉字、中文标点、全角符号在内的所有字符总数
- 【英文字符数】指包括英文字母、英文标点、半角符号在内的所有字符总数
- 其他语言字符这里未作深究
- 【4096】即4K,4K对齐是默认的磁盘扇区对齐规则,如果磁盘未4K对齐则不适用
于是我们就可以根据文件字数算出文件大小,或者根据文件大小算出文件字数。
在实际生活中我们的文本文档基本上是中英文兼具,还包括各种符号,所以对ANSI和utf8编码格式的文档只能算出大致的数据,要算出精确的数据还需要对字符进行分类;对unicode和unicode big endian编码格式的文档能算出准确数据。
可能没有什么实际的用处,只是一时好奇就留意了一下。