Android下可用的wide char 函数库

原文发布:http://www.hellocpp.net/Articles/Article/779.aspx
    附件也请到这里去下载, csdn不知道怎么上传附件。如果上面的网页打不开,说明我还没找到后台管理的密码,稍后想起来了,文章审核到前台就看到了。
    附件地址 http://www.hellocpp.net/Common/Download.aspx?attachment_id=446 。 但愿你能下的到。
    
    Android的NDK对unicode支持的非常差,准确说是wide char系列函数支持都很差。很多函数声明和链接都没问题,但是不工作,用了以后没效果。这里提供一套可以用的宽字节函数库。使用非常简单,对应的函数后面都加 _x 后缀。

     代码从我的引擎里出来的,编译的时候编译错误自己处理下,ds_string 和 ds_wstring改成 string和wstring 就好了。另外,_XEVOL_BASE_API_ 你自己看着办吧。哈哈。 

     大部分的函数类似 wcslen的实现是从glibc里来的,问题不大。

     主要是swprintf和swscanf函数。

     这两个函数在glibc里巨复杂。

     这里介绍一下我的处理方式:

     对于swscanf 。我只是用来格式化输入一些数据的,不会出现输入字串的现象。于是我是先将它转成 ansi的字串,调用ansi的sscanf函数来完成。

     对于swprintf。 则是自己写了一个。最终是分段调用sprintf函数。

 

第二个部分是编码方式的问题。

在Android低版本中是没有wcstombs这样的函数的,你可以编译过去。但是加载会找到不符号的。

所以,还是别用这样的函数了。

我们这里默认使用多字节编码是utf-8。所以说。所有的char* 都是utf-8字串。那么同样的UnicodeToLocale转出来的就是utf-8字串。 Locale == utf-8。这个在Linux下也是非常合理的。

这组函数类似如下:

XEvol_UnicodeToLocale

XEvol_Utf8ToUnicode。

这里utf-8 utf-16(vc下的wchar_t)和utf-32之间的转换我是扒了iccu的代码。可信度还是非常高的。

有这一套函数可以彻底的跟iconv说拜拜了。

 

另外,老衲还是建议,尽量别用swprintf和swscanf这两个函数,用wstringstring吧。 stlport对这个的支持还是不错的。

Android下可用的wide char 函数库_第1张图片

你可能感兴趣的:(linux,工作,android,String,api,引擎)