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等这样的控件出现显示乱的字符.