文本在内存中如何存储?UTF-8编码汉字内存存储相关问题
问题解答
1. 内存中的“汉字”比特序列是什么?和文件存储的序列是否一致?
答案是不一定一致,完全由编辑器的内部字符串编码决定:
- 如果编辑器运行时直接用UTF-8存储字符串,那内存序列和文件完全一致,就是你给出的
11100110 10110001 10001001 11100101 10101101 10010111 - 但绝大多数桌面编辑器不会这么做,比如多数Windows平台软件、Java、JavaScript实现的编辑器默认用UTF-16作为内部编码,这时候“汉”的UTF-16编码为
0x6C49,“字”为0x5B57,对应的比特序列会和原UTF-8序列完全不同 - 要是编辑器用UTF-32做内部编码,每个字符占4字节,序列差异会更大
2. 该比特序列是否和平台有关?
强相关,影响因素包含两部分:
- 平台原生字符编码规范:Windows默认原生接口用UTF-16 LE,大量原生软件就直接用UTF-16 LE存字符串;Linux、macOS的系统调用默认兼容UTF-8,很多原生程序会直接用UTF-8做内部存储
- 编辑器自身实现逻辑:跨平台编辑器会屏蔽平台差异,比如VS Code不管跑在什么系统上,内部都用UTF-16处理字符串,内存序列也不会随系统变化
3. 不同编码的文本会不会出现内存存储比特序列一致的情况?
完全可能,最典型的就是ASCII范围内的字符:
- 不管原文件是GBK、UTF-8、ISO-8859-1哪种编码,只要内容是纯半角英文、数字、符号,编辑器解码后转成内部编码的结果都是一样的,内存比特序列就会完全相同
- 非ASCII字符也存在小概率重合的情况,比如不同编码下的不同字符刚好对应相同的字节序列,解码后转成内部编码的结果也可能一致
内容的提问来源于stack exchange,提问作者yixuan
相关产品推荐
相关产品推荐

