总结一下嵌入式OLED显示屏显示中文汉字的办法
為什么80%的碼農都做不了架構師?>>> ??
這個問題以為很簡單,但最后花很多功夫才能完成,所以總結一下分享給大家。
解決思路
UTF-8->Unicode->GB2312->點陣編碼,其中Unicode轉GB2312要轉碼表,GB2312轉點陣編碼要HZK16字庫。
代碼:https://github.com/lyaohe/UTF-8toGB2312
解決過程
經多番研究,OLED顯示屏顯示中文最簡單還是用HZK16字庫轉點陣編碼,這里有一個算法:
《UCDOS下點陣字庫在嵌入式OLED應用中的移植》
http://www.cqvip.com/read/read.aspx?id=25100512#
想要完整的算法,自行搜索。
當時使用這個算法,在Linux下測試,不對,在Windows測試,轉換編碼正確。
那就奇怪了,經具體了解發現HZK16字庫是符合GB2312標準的16×16點陣字庫
在Linux下使用UTF-8編碼,肯定不對啦,于是找UTF-8的點陣字庫,沒有找到,只好用UTF-8轉GB2312。
在Fedora,有系統函數轉換字符編碼,iconv輕松把UTF-8轉GB2312,可是編譯到板子上始終沒有轉換成功。
又陷入難題,研究發現,使用uclibc庫有iconv函數,但不支持GB2312,氣餒。
網上有同學編譯libiconv庫,可是編譯出來有1M+,有點大,占太空間了。
又要重新思考如何解決,連同事也叫我先放棄這個,先完成其他工作。
我還是不放棄,感覺快要完成,就卡那里,很不服氣。
想嘗試自己動手寫函數實現UTF-8轉GB2312,找資料發現可以實現的。
思路是UTF-8轉Unicode,Unicode轉GB2312,Unicode轉GB2312需要轉換表
測試UTF-8轉Unicode函數,轉換成功。
再到Unicode轉GB2312,可是網上只有GB2312轉Unicode轉換表,要自己動手改成Unicode轉GB2312編碼表,也順便要排個順利,可以二分查找,更快轉換成GB2312。
Unicode轉GB2312其實就是查找,使用二分查找,拿到GB2312的編碼,但不會使用這個編碼,與直接打印出來編碼不同。
經研究GB2312編碼才發現,弄懂幾個知識點,原始編碼,通行編碼,機內碼。
//機內碼與通行碼的關系 unsigned char* str="啊"; printf("0x%X%X\n",str[0],str[1]); //機內碼 printf("0x%X%X\n",str[0] & 0xff,str[1] & 0xff ); //通行編碼也終于解決Unicode轉GB2312的轉換。
最后把代碼都整合起來就行了,我也把代碼分享出來,托管到Github,自行參考。
https://github.com/lyaohe/UTF-8toGB2312
轉載于:https://my.oschina.net/lyaohe/blog/386813
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的总结一下嵌入式OLED显示屏显示中文汉字的办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NativeScript
- 下一篇: ***PHP 遍历数组的方法foreac