symbian txt大文件如何读取(经验分享)

来源:互联网 发布:效果图软件有哪些 编辑:程序博客网 时间:2024/05/08 22:37

读取txt文件主要要解决以下几个问题:

 

1.txt的文件编码格式的识别(UTF8, GBK, UTF16 big endian, UTF16 little endian等) ,UTF16的很好识别,肯定有BOM,因为UTF16又分为Big endian和Little

endian,为了区分必须要有BOM(Byte Order Mark)头。意思是字节序标志头。通过它基本能确定编码格式和字节序。以下是utf编码和对应的bom格式

UTF-8   ---->  EF BB BF   
UTF-16LE ----> FF FE   
UTF-16BE ----> FE FF   
所以通过检测文件前面的BOM头,基本能确定编码格式和字节序。
但是这个BOM头只是建议添加,不是强制的,很多txt小说没有BOM头, 这时就需要你来检测了是什么格式了,就比较麻烦了,当然可以检测,但是不能保证完全准确,只能通过编码范围从概率上来检查,虽然准确度还是比较高,但是不能保证完全正确。我在做《新浪爱读(ido)手机阅读器》symbian 3rd版的时候暂时还没发现哪本检测错误的问题,为了不影响用户阅读速度,最好只检测文件前1K左右的内容,这样一般足够了,否则检测整个文件的话遇到大txt小说就没法仍受了,检测算法哪天有空贴上!


2.大文件的读取问题,如果整个文件加载的话不管是内存不足还是排版都会让你吐血,所以一次性加载整个文件的思路是绝对不可取的,为了解决这个问题,我的做法是内存中始终保留最多三块,每块2k-4k左右大小,你也可以自己定块大小,不过我觉得2k-4k还是比较合适的,这样的话读取就相对来说比较快了,向右翻页时如果内容不足以显示2屏时,预加载随后的2k-4k内容,加载后如果块数大于3,我们可以删除第一块,往回翻页时做法类似我就不多说了,这样就可以保证内存中永远不超过3块,这时就出现了一个很让人头痛的问题,不同编码下每个字符占的字节数不同,如utf8时汉字占3个字节,gbk时汉字占2个字节,这样就导致可能一个汉字处于不同的块中,这样的话下一块转码为unicode编码后显示乱码问题,做《新浪爱读(ido)手机阅读器》1.00beta时我用了一个比较笨的办法,那就是寻找'/n'来解决出现的字符边界的问题,虽然这个可以解决改问题,但处理起来还是相当麻烦的,直接做宽屏版时我无意中找到一个方法,



IMPORT_C TInt CCnvCharacterSetConverter::ConvertToUnicode(TDes16 aUnicode,           const   TDesC8 &aForeign, TInt &aState) const;


 



The number of unconverted bytes left at the end of the input descriptor (e.g. because the output descriptor is not long enough to hold all the text), or one of the error values defined in TError.



  看到这个大家可能想到解决办法了,该函数返回值ret>0时, 我们就去掉剩余不完整的ret个字节,并返回该块读取了多少字节,这样就能确定下一块读取的偏移量(offset)了。这个问题困扰我很久了原来就这么简单,我都已经根据编码来识别了,刚弄完就被我发现了这个函数的返回值原来是这妙处。



3. txt智能断章问题也比较麻烦, 大家一定不要一次性读取整个文件来断章,大文件时肯定会出现viewsrv 11的错误,处理超过10几秒使视图服务器响应不了就回出现该错误)要用CActive长线任务解决,还有文件搜索也需要用CActive长线任务解决,累了,不写了!!!

原创粉丝点击