yietlqwr 发表于 2020-4-20 08:00

记事本存储格式之诡异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-20 21:43

本帖最后由 紫蝶冰澜 于 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:42

hs_f 发表于 2020-4-20 08:26

感谢教导分享!

落叶知秋zdz 发表于 2020-4-20 08:36

很详细的讲解

tlf 发表于 2020-4-20 08:56

wwusq 发表于 2020-4-20 08:57

这个是字符编码的问题吗

yietlqwr 发表于 2020-4-20 09:05

tlf 发表于 2020-4-20 08:56
试了一下,用MS的笔记本另存为:ANSI,UNICDOE,UTF8 转来转去都正常。

表面现象。伪UTF-8,要看编码,不是说字符显示正常。

茕茕白兔. 发表于 2020-4-20 09:15

感谢指导

cc78947 发表于 2020-4-20 09:17

大佬怎么刨这么细的, 如何拥有此技能

Rx0 发表于 2020-4-20 09:34

还真没注意这个问题,原本还在纳闷,有些文本文档用Notepad3打开会是乱码,用Everedit就不会,用Everedit重新保存一次,再用Notepad3打开就正常了。
页: [1] 2 3 4
查看完整版本: 记事本存储格式之诡异UTF-8