mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库
0 引言
還記得通常在MCU驅動LCD,OLED是怎樣顯示漢字的嗎?采用取字模工具,生成字模數組,然后要顯示某個字符,直接索引這個字符的數組,然后對這個數組數據進行顯示就行了,就像這樣:
最近有開發一個物聯網項目,將網絡端的發過來的漢字顯示到屏幕上,但問題來了,我還不知道網絡端要發送具體哪些漢字,我是無法對具體的漢字取模,因此,得想辦法先對所有漢字進行取模,或使用字庫,于是就有了下文。
1 字符編碼
先從字符編碼說起:參考阮一峰博客字符編碼
- ASCII碼:一共規定了128個字符的編碼,這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節的后面7位,最前面的一位統一規定為0。
- 非ASCII碼:英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。
- GB2312,GBK,Unicode,UTF-8均為非ASCII編碼
- Unicode碼:如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。這就是 Unicode,就像它的名字都表示的,這是一種所有符號的編碼。
- 注意:Unicode 只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲
- UTF-8碼:UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式,是Unicode 的實現方式之一。
- GB2312,GBK:GB2312是常用漢字的專用編碼,GBK是所有漢字的專用編碼。
- 注意:GB類的漢字編碼與后文的 Unicode 和 UTF-8 是毫無關系的
2 液晶屏漢字顯示原理
- ASCII字符顯示,由于ASCII字符僅128個,可以實現對每個字符一一取模,且占用MCU的RAM不會過大,此處不再介紹ASCII字符的顯示。
- 為什么顯示英文一般不用字庫芯片? 英文的單詞都是由26個字母構成了,加上大小寫的區別和其它一些字符,也不過才95個。假如要顯示8 * 16像素大小的字符,每一個字符需要16個字節的字庫空間,95個字符即是95 * 16=570個字節。即占用570個字節的RAM。對于小型MCU幾K字節的RAM來說,綽綽有余了。
- 為什么顯示中文需要字庫芯片? 顯示中文的話,需要每一個字的字模,16*16像素大小的中文,每一個中文都要32個字節。GBK收錄了中文兩萬多個,如果要都能顯示,需要700多K字節的空間。所以,我們選擇了把這些字庫放在外部存儲器當中,可選擇2M的FLASH存儲芯片W25Q16做為存儲媒介。放個700多K的字庫足夠了,并且,同時放兩種字體的字庫都沒問題。
- 常規漢字顯示,采用相關的漢字取字模工具(PCtoLCD2002完美版),取出字模,相關參數設置如下所示:
由于我采用的液晶屏是逐行顯示的,不同的液晶屏采用不同的顯示模式,需根據具體情況選擇字模。 取出“你”字模后,將字模數據復制到notepad++,調整成設置好的16列,21行的樣式,在將16進制數據轉換成2進制數據,然后將0替換成空格,即可找出漢字“你”的原型。
- 對于液晶屏而言,字符,圖片的顯示都是像素點的點陣顯示,因此,只要將上述數組中的數據轉換成點陣數據顯示到液晶屏中即可,對于二進制位1的位數據,顯示出該像素點,對于二進制位0的位數據,不顯示該像素點,即可顯示出該漢字(暫不考慮顏色顯示)。
3 字符顯示的實現
上面講到了字符顯示的原理,接下來將講解字符顯示的實現,相關代碼不依賴于底層,具有很好的移植性,且在文章最后放出了Github鏈接,要實現該代碼的功能,需要以下前提條件:
- 已經在液晶屏上實現了畫點功能,該函數將直接調用該功能
- 液晶屏在顯示時,逐行掃描,且需要高位在前(參考上一節相關參數設置,其它類型的屏幕可能有所不同)
注:由于代碼過長,為不影響閱讀,僅放部分關鍵代碼,如有需求,更多請參考文末的Github
for此代碼簡單地實現了索引字模數組中的一個unsigned char類型的元素中的8位,將該8位繪制成像素點,此為字符顯示的基本實現,
4 任意漢字顯示的實現(采用取模法)
本節將講述如何實現任意漢字的顯示。 需要準備以下工具:
- GBK字庫
- 取模軟件
- 二進制文件生成工具 如下圖所示,且相關工具可從文末Github中直接獲取得:
具體操作步驟如下:
- 將字庫取模
在工具欄處點“打開”按鈕,打開gbk_ziku.txt文件,然后根據自己的需要,設置想要的取模方式,然后點工具欄上的“輸出”按鈕 并等待其完成,完成后會在取模軟件所在路徑生成了一個temp.txt文件。現在我是按照“宋體、點陣數為16、字重為4、取模為為16*16、對齊設置為左上、方向設置為橫向取模,高位在左”的方式來取的字模,也就是我平時TFT液晶屏常用的一種字模。
打開temp.txt文件可知, 該文件包含了所有字庫的點陣,且采用GBK編碼排序:
- 將取模的文件生成二進制文件
將該temp.txt文件轉換為二進制文件,供程序讀取。在windows下進入CMD命令控制臺,進入到相關文件所在的路徑,接著,執行命令ziku.exe temp.txt命令,執行效果如下圖所示,執行后將生成一個ziku.bin的文件:
- 將二進制文件存入外部Flash,或Linux系統用戶文件夾下: 得到ziku.bin文件后,可將該字庫二進制文件存入外部Flash如W25Q16中(MCU),或者Linux系統用戶文件夾下(Linux);其中,將該bin文件存放如外部Flash的方法為:
- 單片機與電腦采用串口連接,單片機與W25Q16采用SPI方式連接。所以,我們只需要給單片機寫一個接收串口數據再把數據通過SPI口傳輸到W25Q16中的程序即可。
- 使用FT232H芯片工具,該工具實現了USB轉SPI,USB轉I2C的功能,可直接通過PC的USB接口下載到帶I2C或SPI接口的Flash或E2PROM中。
- 檢驗二進制文件的可用性
本文將只在Linux系統下進行檢驗,MCU環境下的檢驗同理:
該bin文件的檢驗程序如下所示(相關程序均已上傳文章末尾的Github):
#include將以上程序保存為:fontTest.c,gcc編譯,執行,結果如下圖所示:
由執行結果可見,程序能夠從二進制bin文件中提取有用信息,并且,該bin文件保存了GBK編碼的所有漢字,將“你好”替換成其他任意漢字也是可從bin文件中提取出子模的,生成的bin文件是有效的。 接下來講解程序中的幾個注意事項:
- 該程序源文件必須以GBK編碼或GB2312編碼保存(GBK編碼兼容GB2312編碼),在notepad++中,保存方式如下圖所示:
- 解釋下如何獲得內存中字符的偏移量: GBK編碼:每個GBK碼由2個字節組成:
一是0X40-0X7E
二是0X80-0XFE
例如漢字“瑞”的GBK編碼為C8 F0,第一字節C8,位于0X81-0XFE之間,第二字節F0,位于0X40-0XFE之間
第一個字節代表的意義稱為區,那么GBK里面總共有126個區(0XFE-0X81+1=126) 第二個字節代表的意義就是每個區內有多少個漢字,算了一下,一共有190個(0XFE-0X80+0X7E-0X40+2=190)。那么,GBK一共存儲了126X190=23940個漢字。
仔細看GBK編碼第二個字節兩部分中,0X40-0X7E和0X80-0XFE,也就是說它是從0X40~到0XFF,中間的0x7F和最后的0xFF沒有用到。但是為了能夠線性查找,我們暫且認為這兩個字節也存在,就是我們強制把每個區190個漢字當做每個區192個漢字,不過0X7F和0XFF上沒有漢字。
定義GBKH代表第一個字節,GBKL代表第二個字節,字庫的偏移量offset,那么其計算方法如下:
GBKH實現了在控制臺窗口打印漢字字模,那么在TFTLCD,OLED,墨水屏等屏幕上,只要先實現了畫點功能,那么,顯示任意漢字也可以實現的了。
5 任意漢字顯示的實現(采用字庫法)
最后再介紹一種顯示漢字的方法,該方法采用Python實現,直接調用字體庫,僅在Linux系統上可實現,下面將以樹莓派為例,相關的操作如下:
首先安裝好Pillow庫以及必要液晶屏顯示必要的SPI庫,GPIO庫等:
sudo apt-get install python3-pip sudo apt-get install python-imaging sudo pip3 install spidev sudo pip3 install RPi.GPIO sudo pip3 install Pillow安裝 Pillow 如果報錯: ImportError: libopenjp2.so.7: cannot open shared object file: No such file or directory,則先執行如下指令:
sudo apt-get install libopenjp2-7-dev安裝必要的字體:
sudo apt-get install ttf-wqy-zenhei ttf-wqy-microhei接下來是調用微軟雅黑字體進行顯示的部分示例(python3),詳情代碼參考文章末尾留下的Github:
#!/usr/bin/python該代碼的精髓在于,先創建一段緩存,然后采用pillow庫的相關方法通過字符串獲取對應字庫中字符的字模,將字模數據存入緩存中,然后將緩存數據顯示到屏幕上,詳情參考pillow庫中的Image,ImageDraw,ImageFont方法對應的手冊。
注意,代碼中的中文采用UTF-8編碼,保存的時候,為防止亂碼,必須以UTF-8編碼保存(可采用notepad++工具保存為UTF-8編碼)最后,放出相關代碼的Github: 軟件工具,字模bin文件校驗代碼 刷屏代碼示例
總結
以上是生活随笔為你收集整理的mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曝iPhone 14亮黄色要来了!苹果或
- 下一篇: 古巴一波音737客机撞鸟 引擎起火客舱浓