引言
在 TouchGFX 中,文本框控件可用來顯示文字,如果使用 wildcard(通配符)功能,就可以實現(xiàn)動態(tài)文本顯示。比如手環(huán)類應(yīng)用中,當(dāng)手環(huán)收到手機推送過來的信息后,就可以用文本框控件動態(tài)顯示收到的信息。動態(tài)文本顯示通常會使用 wildcard buffer,當(dāng)需要更新文本時,直接更新 wildcard buffer,再重繪 TextArea 控件就可以更新顯示的文本了。
問題
TouchGFX 代碼使用 C++編程語言,使用 Unicode 字符來表示文字,每個字符占用 2字節(jié)。在動態(tài)文本顯示時,通常會使用 Unicode::snprintf 函數(shù),將字符串格式化到wildcard buffer 中,而這里的字符串就必須是 UnicodeChar*類型。C++支持 char 字符和 wchar 寬字符,在測試時,可使用以下代碼來更新動態(tài)顯示,其中 L 表示 wchar 寬字符。
如果您不使用 L 前綴,則假定字符串字面值為窄字符串,其中包含 ASCII 或其他 8 位字符。
原因分析
修改代碼進行調(diào)試,在 Windows 上 Simulator 中正常運行,可看到 wchar 字符占用2 個字節(jié);在開發(fā)板上調(diào)試時發(fā)現(xiàn),wchar 字符占用了 4 個字節(jié),而 snprintf 函數(shù)按Unicode 來解析字符串,解析完第一個字符’d’后,就碰到 0x0000 空字符,解析過程就結(jié)束了,因此控件只顯示了第一個字符’d’。
小結(jié)
在使用 Unicode 字符時要確定好數(shù)據(jù)類型。wchar 在不同編譯環(huán)境中做占用內(nèi)存字節(jié)數(shù)不同,在代碼中盡量不使用’L’前綴。除了’L’之外,還有另一個前綴’u’可用于創(chuàng)建寬字符串,它表示 16 位 Unicode 字符,編碼為 UTF-16。需要注意的是 KEIL 無法識別’u’前綴。當(dāng)然,將 char 字符串格式化到 TextArea wildcard buffer 中時,也使用Unicode::strncpy 函數(shù)代替 Unicode::snprintf 函數(shù)。