Unicode文件头的标识 - 使用IHtmlViewer 接口时遇到的一个问题

现场记录:

 

游戏的帮助界面,使用了IHtmlViewer接口,通过读UTF8编码的html格式文件help.html载入帮助信息,载入IHtmlViewer控件进行显示,程序运行时发现在显示内容的第一行总会有一行的空白,且在LG KV500手机上第一行空白的开头还会带一个方框状的乱码。

 

 

原因分析:

 

Unicode编码方式的文件会有标志位,具体如下:

unicode文件头的标识
Byte-order mark Description
EF BB BF UTF-8
FF FE UTF-16 aka UCS-2, little endian
FE FF UTF-16 aka UCS-2, big endian
00 00 FF FE UTF-32 aka UCS-4, little endian.
00 00 FE FF UTF-32 aka UCS-4, big-endian.

 

为了显示中文帮助信息,help.html文档使用了UTF8方式保存,因此用读文件的方式读出的数据流头3个字节是EF BB BF,在调试时就可以清楚的看到这一点,乱码的原因就在于此。

 

比如新建一个文本文件,内容只有一个字母a,保存后查看文件大小是1字节,另存为unicode编码文件,查看大小,会发现文件大小是4字节。

 

 

2种解决方法:

  1. 将指向文件内容的指针后移3个字节 - (需要额外注意的是,如果移动了指针,利用该指针释放内存时记得先还原,再释放)。具体实现:pBuf += 3;释放时:pBuf -= 3; FREEIF( pBuf );
  2. 检索出头一个html标签的位置,如<HTML>的位置,具体实现:pStart = STRSTR( pBuf,"<") ;

 

最终代码:

if ( NULL != pf ) 
 {
      char *pBuf = NULL;
      char *pStart = NULL;
      IMemAStream* m_pPopAStream;
 
      if( ISHELL_CreateInstance( GetShell(pMe), AEECLSID_MEMASTREAM, (void**)(&m_pPopAStream)) != SUCCESS )
      {
            return;
      }
      ReadFileEx( GetShell(pMe), GAME_HELP_HTML, &pBuf, NULL );
      pStart = STRSTR( pBuf,"<") ;
      if( NULL == pStart )
      {
            pStart = pBuf;
      }
  
      IMEMASTREAM_SetEx( m_pPopAStream, (void*)pStart,STRLEN(pStart)*sizeof(char), 0, NULL, NULL);
 
      IHTMLVIEWER_LoadStream( pMe->m_pHTMLViewer, (IAStream*)m_pPopAStream);
 
      if( NULL != pf )
      {
            IFILE_Release(pf);
            pf = NULL;
      }
  
      if( NULL != m_pPopAStream )
      {
            IMEMASTREAM_Release( m_pPopAStream);
            m_pPopAStream = NULL;
      }
  
      FREEIF(pBuf);
   
 } 
 else
 {
    IHTMLVIEWER_SetData( pMe->m_pHTMLViewer, "<h1>Error</h1>File Not Found", -1);
 }


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值