本帖最后由 aiksie 于 2019-10-3 09:21 编辑
刚好用到需要取txt文件文本编码,本来是想先在论坛上找的,也找到了论坛发的相关的东西
https://bbs.125.la/forum.php?mod=viewthread&tid=14450853
http://e.125.la/fun-1156.html【完全只根据特征码】
https://bbs.125.la/forum.php?mod=viewthread&tid=14310538 【调用了未开源的非微软官方DLL,不喜欢】
后来我发现自带的编码转换支持库就可以做到判断文件的编码
变量名 | 类 型 | 静态 | 数组 | 备 注 | file | 字节集 | | | bool | 逻辑型 | | |
file = 读入文件 (参_文件路径 )编码转换 (file, #编码_UTF_8, #编码_GBK, bool )判断 (bool )返回 (1 )编码转换 (file, #编码_GBK, #编码_UTF_8, bool)判断 (bool )返回 (2 )返回 (0 )
再后来我直接逆向了notepad.exe,直接分析出了记事本自己是怎么识别编码的,并且写出了算法。
下面是源码:
变量名 | 类 型 | 静态 | 数组 | 备 注 | 文件长度 | 整数型 | | | 取出位置 | 整数型 | | | 循环取出内容 | 字节集 | | | 循环取出数值 | 整数型 | | | 返回值 | 整数型 | | | 次数 | 整数型 | | |
文件长度 = 取字节集长度 (参_文件内容 )次数 = 0 判断 (文件长度 ≤ 0 )返回 (假)取出位置 = 1判断循环首 (取出位置 ≤ 文件长度 )循环取出内容 = 取字节集中间 (参_文件内容, 取出位置, 1 )循环取出数值 = 取字节集数据 (循环取出内容, 3, )判断 (循环取出数值 > 127 )返回值 = 0 判断 (次数 = 0 )判断 (循环取出数值 < 128 )循环判断首 ()循环取出数值 = 汇编左移 (循环取出数值, 1 )次数 = 次数 + 1 循环判断尾 (循环取出数值 > 127 )次数 = 次数 - 1 判断 (循环取出数值 = 0 )返回 (假)循环取出数值 = 位与 (循环取出数值, 192 ) 判断 (循环取出数值 = 128 )次数 = 次数 - 1 返回 (假)取出位置 = 取出位置 + 1 判断循环尾 ()判断 (次数 ≠ 0 )返回 (假)判断 (返回值 = 0 )返回 (真)返回 (假)|
汇编左移 | 整数型 | | |
欲移动的整数 | 整数型 | | | | 欲移动的位数 | 整数型 | | | | 置入代码 ({ 139, 69, 8, 139, 77, 12, 210, 224, 201, 194, 2, 0 })返回 (-1 ) 变量名 | 类 型 | 静态 | 数组 | 备 注 | 文件内容 | 字节集 | | | 文件长度 | 整数型 | | | lpiResult | 整数型 | | |
文件内容 = 读入文件 (参_文件路径 )文件长度 = 取字节集长度 (文件内容 )判断 (取字节集中间 (文件内容, 1, 2 ) = { 239, 187 }) 判断 (文件长度 ≤ 2 )判断 (取字节集中间 (文件内容, 3, 1 ) = { 191 })返回 (1 )判断 (取字节集中间 (文件内容, 1, 2 ) = { 255, 254 }) 返回 (2 )判断 (取字节集中间 (文件内容, 1, 2 ) = { 254, 255 }) 返回 (3 )lpiResult = -1判断 (IsTextUnicode (文件内容, 文件长度, lpiResult )) 返回 (2 )判断 (是否为UTF8 (文件内容 )) 返回 (1 )返回 (4 )
Dll命令:
文件_取文本编码.e
(7.88 KB, 下载次数: 104)
|