ucGUI汉字处理的一些问题

来源:互联网 发布:淘宝球衣正品店 编辑:程序博客网 时间:2024/05/19 15:23

ucGUI汉字处理的一些问题

一些朋友问我在用ucGUI时汉字处理遇到的问题,现在我把它写下了,实际上现在我用的这个版本,对汉字的处理已经很好了.

ucGUI版本3.94

这个版本以上应用支持双字节的处理了,比如中文,日文等。

我在这个版本上处理了3个问题,基本上汉字的处理都可以了.不管是显示,修改,输入法.

1:汉字字库

要实现汉字双字节的显示,只要用其相应的工具把一个字库转换成点阵就好了。

指定控件相应的字体就能显示了,但还有一个问题,虽然能正常显示了,当用汉字输入到EDIT等控件时,移动光标,可以看到移动是的半个汉字,这样就出问题了,出现这样的问题就是计算字符个数时出错了。

还要做如下的处理:

2:调用GUI_UC_SetEncodeGBK()

在程序开始时调用 GUI_UC_SetEncodeGBK()这个过程就可以了,实际上就是初始化 GUI_Context.pUC_API的一个指针,这个包含了计算字符的宽度,大小等过程。


如下的代码:

/*********************************************************************
*
*       _API_Table
*/
static const GUI_UC_ENC_APILIST _API_Table_GBK = {
  _GetCharCode,     /*  return character code as U16 (Unicode) */
  _GetCharSize,     /*  return size of character: 1/2/3        */
  _CalcSizeOfChar,  /*  return size of character: 1/2/3        */
  _Encode           /*  Encode character into 1/2/3 bytes      */
};


/*********************************************************************
*
*       Exported code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI_UC_SetEncodeGBK
*/
void GUI_UC_SetEncodeGBK(void) {
  GUI_LOCK();
  GUI_Context.pUC_API = &_API_Table_GBK;
  GUI_UNLOCK();
}


3:一个BUG处理

如上处理后,EDIT等控件能正常显示和修改修入汉字了。

但在我使用的过程中发现了一个BUG,几次修改EDIT控件的值(包括汉字时),在字符结尾处就出现了乱码。正常的字符都显示出来了。

通过跟踪发现,需要对一个方法更改:

/*********************************************************************
*
*      GUICharLine.c  GUI_GetLineDistX
*
*  This routine is used to calculate the length of a line in pixels.
*/
int GUI__GetLineDistX(const char GUI_UNI_PTR *s, int MaxNumChars) {
  int Dist = 0;
  if (s) {
    U16 Char;
    #if GUI_COMPILER_SUPPORTS_FP
      if (GUI_Context.pAFont->pafEncode) {
        return GUI_Context.pAFont->pafEncode->pfGetLineDistX(s, MaxNumChars);
      }
    #endif

    while (--MaxNumChars >= 0) {

Char  = GUI_UC__GetCharCodeInc(&s);
      if(Char == 0)        //jhting: 2012-09-26 Edit_ display GBK BUG 
  break;

      Dist += GUI_GetCharDistX(Char);
    }
  }
  return Dist;
}

红色字体就是我加入的,应这个方法里转入的长度是按单字节来计算的,没有考虑双字节,在while里就会出现读到串尾后面的值,而使EDIT等这样的控件出现显示乱的字符.


原创粉丝点击