WinCE英文系统显示汉字乱码问题 && 移植 libconv 到WinCE

WinCE英文系统显示汉字乱码问题 && 移植 libconv 到WinCE
转载请保留出处!!

WinCE英文系统显示汉字乱码问题

工作上需要在英文的WinCE系统上显示汉字(有汉字字库,注册表也有注册),使用
MultiByteToWideChar 结果不对,后边发现用在英文系统下根本不能用 MultiByteToWideChar 来实现
gbk  ===>  ucs-2 的字符集转换,因为系统中没有 gbk==>ucs-2 的转换码表。
在WinCE下,转换码表文件是 /Windows/wince.nls,  用PB制作系统的时候,PB会根据你选择的语言把相对应的转换码表写到 wince.nls 文件中。

解决方式1:

要想让 MultiByteToWideChar 正确工作,需要做下面的工作:
1. 在 wince.nls 中打入所要支持的转换码表(在PB的语言支持种选择所支持的语言)
2. 系统上有语言所对应的字库
3. 在系统上注册为默认字库
4. 正确的设置系统默认的语言

具体请参考:  http://www.asuspda.net/viewthread.php?tid=15570&pid=351746


解决方式2(未测试): 不要用 MultiByteToWideChar,所有的文件都是 UNICODE 格式保存的。
解决方式3: 使用 libconv (见下面: 移植 libconv 到WinCE

Q: 这里为什么目标编码是 ucs-2
A: Windows系统中所申明的 UNICODE 指的是: ucs-2 (unsigned short, 2b), 还有 ucs-4 (unsigned int, 4b)

Q: 为什么下面的代码在英文系统上没有显示乱码

    
    wchar_t
* msg1 = TEXT( "中文消息" ) ;
    : : MessageBox( NULL , msg1, NULL , MB_OK) ;

A: 这段代码中, TEXT 宏是 VC 专用的 ,evc, vc6等编译器在编译时会把 TEXT 宏中的字符串转换成
   UNICODE 编码,如果字符串是从文件(非UNICODE格式保存的)中读出来的就会显示乱码


移植 libconv 到WinCE

所需要的文件:
libiconv/1.11/lib/*.h
libiconv/1.11/lib/iconv.c
libiconv/1.11/include/iconv.h
libiconv/1.11/libcharset/config.h
libiconv/1.11/libcharset/lib/localcharset.c
libiconv/1.11/libcharset/include/libcharset.h

需要注意的地方:
1. libconv的配置在
libiconv/1.11/lib/config.h ,libiconv/1.11/libcharset/config.h
2. WinCE下面没有 errno.h ,可以复制一个pc下用的,保留其中的宏定义和 extern int errno
   注释掉其他的函数,添加

   #ifdef _WIN32_WCE
       int errno;
   #endif 

3. WinCE下没有 abort, mbrtocs函数,可以自己写一个:

      # ifdef _WIN32_WCE
      static void _wce_abort( )
      {
          DebugBreak( ) ;
      }

      static size_t _wce_mbrtocs( . . . )
      {
          return - 1;
      }

      # define abort _wce_abort
      # define mbrtocs _wce_mbrtocs

      # endif


4. 修改部分:
   a. libiconv/1.11/lib/loop_unicode.h
      函数 unicode_loop_convert 中
   
      outcount_ok:
          ...
          memcpy(outptr, &wc, outcount);   //添加
          outptr += outcount; outleft -= outcount;
    
      函数返回处:
        *inbuf = (const char*) inptr;
        *inbytesleft = inleft;
        *outbuf = (char*) outptr;
        *outbytesleft = outleft;

         return result;

     改为:
       // *inbuf = (const char*) inptr;
       // *inbytesleft = inleft;
       // *outbuf = (char*) outptr;
       // *outbytesleft = outleft;

       return (*outbytesleft - outleft);


文件下载:
libiconv-1.11(WinCE).src.rar
libiconv-1.11(WinCE).dll.rar
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值