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