分享

在Lua中使用Unicode

 quasiceo 2014-01-05
分类: 常见问题FAQ 2008-12-06 21:57 3578人阅读 评论(0) 收藏 举报

这是一个事实上已经解决的,但是却很难搜索到方案的问题。在这点上不得不佩服老外的兜圈子和中国人的没耐性。关于这个问题比较详细的文档是lua-suers wiki上的一篇http:///wiki/LuaUnicode ,看完之后,虽然懂了不少,还是没解。这点也怪不得人家,Unicode的问题对于东亚语系才是不得不解决的问题。倒是中文资料总是三言两语带过,确实让人很愤懑。

总的来说,就是lua因为使用长度来标示字符串的长度,所以在一个字符串里面储存Unicode的字符是没有问题的。因此,要使得lua中的字符串能够直接被使用Unicode的系统使用,只需要开始的时候将字符串转换为Unicode保存在lua的字符串中就可以了。

也就是注册一个mbs2uni的函数到lua环境,然后定义字符串的时候用s=mbs2uni("xxxx")这样的语句就可以了。缺点就是有些针对字符串的操作有可能不能正确执行,但其实很多情况,我们只是需要在程序中保存一个字符串而已。

因为从UTF-8到Unicode是很容易的,推荐做法是把lua的源程序保存为UTF-8格式,这样只需要提供一个utf8ToUnicode16的函数就可以了,而这个函数是很容易自己实现的,从而增加了移植性。

这个函数恒定返回转换utf8字符串需要的数组大小,并在转换后的Unicode字符串的最后面加一个L'/0'。

  1. int  utf8ToUnicode16( const   char * utf8, WChar* unicode16,  int  length) {
  2.      char  c;
  3.      int  i = 0;
  4.     --length;
  5.      while  (c = *utf8) {
  6.          if  (c & 0x80) {
  7.              if  (c & 0x20) {
  8.                  if  (i < length) {
  9.                     unicode16[i] = ((utf8[0] & 0xf) << 12) | ((utf8[1] & 0x3f) << 6) | ((utf8[2] & 0x3f));
  10.                 }
  11.                 ++i;
  12.                 utf8 += 3;
  13.             }  else  {
  14.                  if  (i < length) {
  15.                   unicode16[i] = ((utf8[0] & 0x1f) << 6) | ((utf8[1] & 0x3f));
  16.                 }
  17.                 ++i;
  18.                 utf8 += 2;
  19.             }
  20.         }  else  {
  21.              if  (i < length) {
  22.                 unicode16[i] = c;
  23.             }
  24.             ++i;
  25.             ++utf8;
  26.         }
  27.     }
  28.      if  (i <= length) {
  29.         unicode16[i] = 0;
  30.     }
  31.      return  i + 1;
  32. }

注册到lua环境中的函数

  1. static   int  l_utf8ToUnicode16(lua_State* L) {
  2.     WChar a[256];
  3.     WChar* unicode16 = a;
  4.      int  length = 0;
  5.      const   char * utf8;
  6.     
  7.     utf8 = luaL_checkstring(L, 1);
  8.     length = utf8ToUnicode16(utf8, unicode16, 256);
  9.      if  (length <= 256) {
  10.         lua_pushlstring(L, ( const   char *) unicode16, length * 2);
  11.     }  else  {
  12.         unicode16 = (WChar*)malloc(length);
  13.         utf8ToUnicode16(utf8, unicode16, length);
  14.         lua_pushlstring(L, ( const   char *) unicode16, length * 2);
  15.         free(unicode16);
  16.     }
  17.      return  1;
  18. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多