引言
在 TouchGFX 中,文本框控件可用来显示文字,如果使用 wildcard(通配符)功能,就可以实现动态文本显示。比如手环类应用中,当手环收到手机推送过来的信息后,就可以用文本框控件动态显示收到的信息。动态文本显示通常会使用 wildcard buffer,当需要更新文本时,直接更新 wildcard buffer,再重绘 TextArea 控件就可以更新显示的文本了。
问题
TouchGFX 代码使用 C++编程语言,使用 Unicode 字符来表示文字,每个字符占用 2字节。在动态文本显示时,通常会使用 Unicode::snprintf 函数,将字符串格式化到wildcard buffer 中,而这里的字符串就必须是 UnicodeChar*类型。C++支持 char 字符和 wchar 宽字符,在测试时,可使用以下代码来更新动态显示,其中 L 表示 wchar 宽字符。
如果您不使用 L 前缀,则假定字符串字面值为窄字符串,其中包含 ASCII 或其他 8 位字符。
原因分析
修改代码进行调试,在 Windows 上 Simulator 中正常运行,可看到 wchar 字符占用2 个字节;在开发板上调试时发现,wchar 字符占用了 4 个字节,而 snprintf 函数按Unicode 来解析字符串,解析完第一个字符’d’后,就碰到 0x0000 空字符,解析过程就结束了,因此控件只显示了第一个字符’d’。
小结
在使用 Unicode 字符时要确定好数据类型。wchar 在不同编译环境中做占用内存字节数不同,在代码中尽量不使用’L’前缀。除了’L’之外,还有另一个前缀’u’可用于创建宽字符串,它表示 16 位 Unicode 字符,编码为 UTF-16。需要注意的是 KEIL 无法识别’u’前缀。当然,将 char 字符串格式化到 TextArea wildcard buffer 中时,也使用Unicode::strncpy 函数代替 Unicode::snprintf 函数。