日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql unicode转汉字_任意汉字显示,给你的嵌入式系统(含MCU)装上字库

發布時間:2023/12/15 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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個字節組成:
第一個字節為0X81~0XF: 第二個字節分為兩部分:
一是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)装上字库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 小早川怜子久久精品中文字幕 | 人人妻人人澡人人爽精品日本 | 中文精品一区二区三区 | 国产精品视频一区在线观看 | 国产视频在线观看网站 | 亚洲调教欧美在线 | 丁香花五月天 | 91av在线看 | 亚洲免费视频网站 | 奇米中文字幕 | 亚洲免费一区 | 国内精品小视频 | 精品久久久久久无码中文野结衣 | 国产精品视频第一页 | 91麻豆精品久久久久蜜臀 | 91网入口| 曰本丰满熟妇xxxx性 | 国产一区在线观看视频 | 天堂av在线中文 | 亚洲天堂五码 | 多毛的亚洲人毛茸茸 | 亚洲国产高清在线 | 一区二区欧美精品 | 久久精品国内 | 国产精品成人免费一区久久羞羞 | 手机看黄色 | 日本高清视频在线播放 | 国产精品久久久久久久久久久免费看 | 免费黡色av | 制服丝袜在线视频 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | av不卡免费在线 | 高清国产一区二区 | 久久久久久久久久久久久久 | 妞妞影视 | 亚洲AV不卡无码一区二区三区 | 浪漫樱花在线观看高清动漫 | 日本久操视频 | 两女双腿交缠激烈磨豆腐 | 国产精品免费视频观看 | 午夜精品久久久久久久久久久久久蜜桃 | 美国黄色一级毛片 | 欧美69影院 | 成年人黄色一级片 | 图片区视频区小说区 | 超碰免费av | 天堂av一区 | 欧美大色一区 | 欧洲精品一区二区三区久久 | 亚洲精品毛片av | 亚洲第一偷拍 | 超碰在线观看av | 日韩免费电影一区 | 就爱av| 在线观看一区二区视频 | 亚洲精品国产精品乱码不99 | 鸥美一级片| www.中文字幕在线观看 | 国产精品久久一区 | 一级黄色录像大片 | 免费在线 | 天天尻| 2024男人天堂| 91黄色片 | 日韩av中文字幕在线 | 色偷偷免费视频 | 夜夜夜影院 | 一区二区三区在线免费观看视频 | 免费涩涩 | 亚洲第三十七页 | 人妻互换一区二区三区四区五区 | 色呦呦视频在线 | 青娱乐最新地址 | 午夜黄色小视频 | 亚洲视频在线视频 | 一本大道久久a久久精二百 琪琪色在线视频 | 日本人妻伦在线中文字幕 | 91免费.| 五月婷婷激情综合网 | 欧美一区二区三区观看 | 深夜福利一区二区三区 | 免费黄色在线观看 | 小镇姑娘国语版在线观看免费 | 国产a视频免费观看 | 日产精品久久久一区二区 | 97在线精品| 中文字幕无码精品亚洲资源网久久 | 亚洲嫩草影院 | 丁香婷婷一区二区三区 | 国产超碰在线观看 | 欧美日韩国产色 | 亚洲最新在线 | 亚洲蜜臀av乱码久久精品蜜桃 | 台湾性dvd性色av | xxx综合网| 日韩黄色一级视频 | 国产三级全黄裸体 | 97超在线| 1区2区3区在线观看 久久久久久久久久久影院 成人网址在线观看 |