1. 为什么你的U8G2显示不了中文?
第一次用U8G2库显示中文的朋友,十有八九会遇到这个经典问题:用drawStr()显示英文完全正常,换成中文就死活不显示。这其实不是代码写错了,而是函数用错了地方。就像用螺丝刀去钉钉子,工具本身没问题,只是用错了场景。
U8G2库在设计时,drawStr()原本就是为ASCII字符设计的。它内部采用单字节编码,只能处理0-127的字符范围。而中文属于Unicode字符集,一个汉字占2-3个字节。当drawStr()遇到多字节的中文字符时,它只会读取第一个字节,剩下的字节就被当作无效字符丢弃了。这就是为什么你的OLED屏幕上"Hello"显示正常,而"你好"却消失不见。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三种显示函数的本质区别
2.1 drawStr()的局限性
这个函数是许多初学者最先接触到的文本显示方法,因为它简单直接。但它的设计初衷就是处理纯英文:
cpp复制// 只能正确显示ASCII字符
u8g2.drawStr(10, 20, "Hello"); // 正常
u8g2.drawStr(10, 40, "你好"); // 失效
底层实现上,drawStr()会逐个字节处理字符串,遇到非ASCII字符就直接截断。好比一个只会说英语的人,听到中文时只能识别第一个音节。
2.2 print()的智能转换
print()函数之所以能处理中文,秘密在于enableUTF8Print()这个开关:
cpp复制u8g2.enableUTF8Print(); // 关键配置
u8g2.setCursor(10, 20);
u8g2.print("你好"); // 正常显示
启用UTF-8支持后,print()会自动将Unicode字符转换为U8G2内部能处理的格式。相当于给系统装了个翻译器,把中文转成设备能理解的指令。
2.3 drawUTF8()的专精方案
这是专门为多语言设计的显示函数:
cpp复制u8g2.drawUTF8(10, 20, "你好啊"); // 原生支持UTF-8
与print()不同,drawUTF8()从设计之初就考虑到了多字节字符处理。它不需要额外的编码转换,直接支持UTF-8输入。在需要精确控制显示位置时,这个函数往往比print()更可靠。
