记事本存储格式之诡异UTF-8
本帖最后由 yietlqwr 于 2020-4-20 16:44 编辑记事本存储格式之诡异UTF-8
本帖意图:希望众大神出手解决两个问题:
1、让系统自带记事本在以UTF-8格式存储时,BOM头为EF BB BF,且一个汉字以3字节保存;
2、去除utf-8-tool.exe的自校验,进而汉化界面。
(感谢610100 朋友,在他的帮助下已解决)
utf-8-tool样本下载地址:https://yietlqwr.lanzouj.com/ibmfpng
一、系统自带记事本的问题
文本文档,默认是ANSI格式,转存为UNICODE格式时,加上了BOM头FF FE,一个汉字2字节,编码当然也变了,这个没有问题,属正常现象;但是以UTF-8格式存储时,却是仅在UNICODE基础上再加上FF FE头,一个汉字还是2字节,且编码与UNICODE完全相同,如下图:
找了个工具utf-8-tool.exe,
将文档转化,得到BOM头为EF BB BF的真正UTF-8格式文档,此时一个汉字为3字节编码,如图
这个结果和以前XP下的记事本UTF-8格式是一样的。
更诡异的是,转来转去,将utf-8-tool.exe也同化了,转带BOM头的UTF-8时也变成和记事本一样了!此后,utf-8-tool.exe死活也转不成BOM头为EF BB BF一汉字3字节的UTF-8了!真是吊诡!!!
二、utf-8-tool.exe汉化去校验的问题
经查utf-8-tool.exe无壳,显示由Microsoft Visual C++ 6.0 编译
由关键字定位到代码,仅修改一字符,将t改成T,软件就不能正常运行,出现
再由关键字定位到代码的3AE0处进而找到1350处,却不知如何去校验了……
感谢610100 朋友,在他的帮助下解决了第二个问题,
这个utf-8-tool.exe工具中即用了3字节表示一个汉字UTF-8编码,而有些地方又是2字节一汉字,有些乱。
本帖最后由 紫蝶冰澜 于 2020-4-21 09:04 编辑
UTF-8是可变长的编码方式,从1到6字节不等,可以根据编码的高位标记1和占位0判断出具体读取多少个字节,把x提取出来就是UNICODE的编码
UNICODE和UTF-8转换对照表
|Unicode|UTF-8|
|---|---|
|0000 0000-0000 007F |0xxx xxxx|
|0000 0080-0000 07FF |110x xxxx 10xx xxxx|
|0000 0800-0000 FFFF |1110 xxxx 10xx xxxx 10xx xxxx|
|0001 0000-0010 FFFF |1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx|
|0020 0000-03FF FFFF |1111 10xx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx|
|0400 0000-7FFF FFFF |1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx|
1字节时,与ASCII兼容
2字节时,兼容ISO8859-1,支持西欧和希腊
3字节时,兼容GBK、BIG5
等等
```
//“汉字” UTF-8 11100110,10110001,10001001 11100101,10101101,10010111
//提取x ____0110,__110001,__001001 ____0101,__101101,__010111
// 重新整理一下 0110 1100 0100 1001 0101 1011 0101 0111
// 转16进制 6c,49,5b,57
// 加上BOM fe,ff,6c,49,5b,57
//这就是“汉字”的UNICODE
```
转换为UNICODE标准后,建议用BOM来区分字节序,因为在不同的系统中,存在大端和小端(字节编码的正序逆序)
UTF-8 BOM:EF BB BF,“汉字”:EF BB BF, E6 B1 89, E5 AD 97
UTF-16 LE:FF FE,FF在左边,HEX的左边是高位,“汉字”:FF FE, 49 6C, 57 5B
UTF-16 BE:FE FF,FF在右边,HEX的右边是高位,“汉字”:FE FF, 6C 49, 5B 57 感谢教导分享! 很详细的讲解 这个是字符编码的问题吗 tlf 发表于 2020-4-20 08:56
试了一下,用MS的笔记本另存为:ANSI,UNICDOE,UTF8 转来转去都正常。
表面现象。伪UTF-8,要看编码,不是说字符显示正常。 感谢指导 大佬怎么刨这么细的, 如何拥有此技能
还真没注意这个问题,原本还在纳闷,有些文本文档用Notepad3打开会是乱码,用Everedit就不会,用Everedit重新保存一次,再用Notepad3打开就正常了。