本帖最后由 jzlhll 于 2015-12-12 01:05 编辑
还是写写心路历程吧。
大家都知道TC只能读取unicode编码的文本,我想实现读取utf8,思路如下:
1. 刚开始用TC每读一行,发现中间只有中文是乱码,英文(ascii玛)是正确的,于是我想是不是将错误的中文打印出2进制来再转一下编码就ok了呢?
2. 结果验证了很久,才发现,读取的一行,中文已经被错误的转成unicode了(帮助文档中有描述),导致了编码的错乱。(有兴趣的需要去了解unicode和utf8文件的编码原理);
3. 上面的路死了,那么,我想找dll或者脚本来处理,论坛上几乎没有资源,有资源的,又发现不对劲,没有描述,脚本dll工具检测提示也没有参数返回值(如图dll插件)。于是我就想自己实现。
4. 易语言?c++?如何编写?教程也少,多的都是易语言。本人比较熟悉visual studio,于是就想用c++/c实现。正好发现帮助文档中有一个vs2010版的TCdllcallModule hello。
5. 导入这个项目,直接可以测试,确实可以用;这里也有陷阱,首先WINAPI这个方法的返回值建议是long,并且输入的参数,不能是c o n s t!,否则报错。
因此我就直接套用了hello()的参数形式。
6. 然后我就研究utf-8 unicode的编码。写了1.5天。
目前实现了utf8->unicode的转码。
原型:
- long WINAPI convertUtf8ToUnicode(char *filename, char * filenamewrite, int isLE)
复制代码 说明:
转化utf8到unicode,utf8文件可以带BOM或无,unicode可以指定LE/BE
filename 是read的文件
filenamewrite 是write的文件,注意该文件如果存在会被删除
isLE 需要保存的是LE还是BE(TC读取的是LE,因此传入1)
return -1表示读取的文件无法打开,-2表示写入的文件无法修改,0表示正常
TC使用:
- dllcall(getrcpath("rc:TCdllcallModule.dll"),"long","convertUtf8ToUnicode","char *","D:\\a.log","char *","D:\\converted.log", "int", 1)
复制代码 实测:
由于基本是C代码编写的,效率非常高,写了测试时间代码,转换100M文件只需要1s左右。
并且本人指针管理的较好,不用担心出错(当然如果有错请告知我,给我,你的原文本,我来分析分析也提高我的dll,然后继续共享给大家)。
如果有疑问请回帖。
计划:
我会再不久的将来有时间搞一下其他的编码,比如ANSI, GBK,或者搞一下unicode转其他。
(等级太低没法设置隐藏回复,那么,看着好的请一定回复下,我才有动力继续写.thanks.)
|