日志中出现乱码_合宙Luat | 乱码搞得一团糟?开源神器帮你轻松修复
鎰熸仼鐩擱亣
緹庡ソ鐨勬椂鍏変笌澶у鐩鎬即
2021錛屾柊騫村揩涔愶紒
相信大家在日常生活中,都見過類似上面的字符串。這些看起來不明所以的內容,通常被稱作亂碼。
那么亂碼是如何產生的,并且如何修復呢?我們接下來將一步步講解。
1
你須知道的編碼規則
字符串,本質上都是一個字節一個字節的數據,連在一起存儲的。而要將這些數據顯示在屏幕上,則需要按一種編碼規則進行解析。
ASCII編碼
ASCII編碼是最容易理解的。ASCII編碼因為每個字符僅占用7bit,所以最多只能存儲127個字符,而每個字符都有唯一的一個數字與其對應。
例如:
數字0x35在這種編碼規則下,會被解析為字符5;
數字0x6C在這種編碼規則下,會被解析為字符l ;
數字0x4C在這種編碼規則下,會被解析為字符L;
具體對應規則,可以在網上搜索ASCII 碼表查看。
按照這種規則,一串hello,用16進制數據表示就是:
68 65 6C 6C 6F
GB2312編碼
因為ASCII只能顯示127個字符,遠遠不能滿足中文字符的顯示需求,所以中國國家標準總局于1980年發布了國家標準代碼GB2312標準(目前最新標準為GB18030)。
簡單來說,在這套編碼規范下,每個中文字符可以由2個字節表示,例如:
啊?的實際數據為0xB0 0xA1 ;
測?的實際數據為0xB2 0xE2 ;
試?的實際數據為0xCA 0xD4 。
同時,因為ASCII編碼下每字節使用了7bit(0x00-0x7f ),GB2312為了對其進行兼容,規定每個中文字符的高位字節(第一個字節)使用0xA1–0xF7的范圍,避開了ASCII編碼使用的區域。
也就是說,象下面的一串混用了中英文的數據,也可以正常被解析并顯示出來:
B2 E2 CA D4 31 32 33 B2 E2 CA D4
實際內容:
B2 E2(測) CA D4(試) 31(1) 32(2) 33(3) B2 E2(測) CA D4(試)
UTF-8編碼
UTF-8可以使用1-4字節來表示字符,因為其兼容性強,可以對Unicode字符集中的所有有效編碼點進行編碼,是目前使用最廣泛的編碼標準。
與GB2312一樣,UTF-8同樣兼容ASCII編碼。只是UTF-8比GB2312包含了更多字符,并且每種字符的字節數并不是完全固定的。
由于編碼規則比較復雜,這里不作具體解釋,僅舉例說明:
啊?的實際數據為0xE5 0x95 0x8A;
測?的實際數據為0xE6 0xB5 0x8B;
試?的實際數據為0xE8 0xAF 0x95。
其他編碼
除了ASCII、GB2312和UTF-8編碼,還有許多編碼標準,他們大部分互不兼容。
2
存儲和傳輸字符串數據
數據都是要進行存儲和傳輸的,與編碼息息相關。
存儲
微軟使用BOM頭這種技術來為純文本文件標記其編碼,這樣打開文件時就可以用正確的編碼進行解析。
而大部分Linux不使用類似技術,所以讀取后只能靠猜測,或強行指定,來進行顯示。
傳輸
傳輸不僅指字符串數據在互聯網上的傳輸,也包括了在各類函數調用過程中的傳輸。這類操作通常都不會帶有字符編碼標準的標記,一般靠直接指定編碼來解決。
3
為何會產生亂碼
聰明的你應該已經想到了,如果一串某編碼的數據,被人使用另一種編碼標準進行解析,那么得出的結果幾乎一定是錯誤的。
比如測試解析結果這幾個字,我們使用UTF-8編碼,得到下面16進制數據:
E6B58BE8AF95E8A7A3E69E90E7BB93E69E9C
如果,收到這些數據的人嘗試使用GB2312編碼來顯示,那么結果就是我們非常熟悉的亂碼了:
嫻嬭瘯瑙f瀽緇撴灉
上面的過程就是典型的亂碼形成過程。
4
如何修復亂碼
亂碼是否可以還原?答案是肯定的,只需要按亂碼形成時的操作反過來做一遍就可以恢復了。但是有些編碼中會出現?這種無法解析顯示的數據,這部分數據就完全丟失了。
一般的亂碼修復操作,就是把各種編碼可能性都試一遍,看哪個結果可靠,那么就是原始內容。
這里推薦使用開源工具—— LLCOM (llcom.papapoi.com),來進行亂碼恢復工作。
LLCOM
可運行Lua腳本的高自由度串口調試工具。
- 可獨立運行Lua腳本,并擁有定時器與協程任務特性(移植自合宙Luat Task架構);
- 其他串口調試功能具有的功能;
- 收發日志清晰明了,同時顯示HEX值與實際字符串;
- 自動保存串口與Lua腳本日志,并附帶時間;
- 串口斷開后,如果再次連接,會自動重連;
- 發送的數據可被用戶自定義的Lua腳本提前處理;
- 右側快捷發送欄,快捷發送條目數量不限制。
更多精彩,敬請期待!
我們用上一節生成的亂碼數據作為例子,嘗試修復:
可以看到可靠的結果已經顯示出來,修復成功。
5
如何避免亂碼
建議在寫代碼時統一使用UTF-8編碼,這是目前互聯網的最主要的編碼形式。
如果是資源占用緊張,但依舊需要中文顯示的地方,可以考慮使用GB2312編碼存儲數據。
了解合宙Luat開源架構:
Luat = Lua + AT,合宙推出的物聯網創新開源架構,依托于通信模塊做簡易快捷的開發,將傳統的AT命令用Lua語言封裝成API,并提供各種功能應用的demo,大大減少用戶的開發成本。
Luat入門教程
http://doc.openluat.com/wiki/3?wiki_page_id=606
開發指南
白話Lua教程
簡明Lua語法
LuaTools
第一個工程
Luat框架
Luat API接口 (2G)
Luat API接口 (4G)
LuaTask 庫消息和注解
Luat云平臺
今天就分享到這里,你學會了嗎
本文將持續在Luat社區更新
http://doc.openluat.com/article/2113/0
- 歡迎加入Luat 社區 -
社區賬戶與ERP系統通用
Lua教程?|?模塊資料?|?問答系統?|?工具下載?| 經驗分享
快來領取專屬福利~方式一:留言互動
參與微信公眾號合宙Luat的最新推文留言互動,最先留言的前五位朋友可獲贈五折券一張;
方式二:好友助力
關注合宙Luat公眾號并后臺留言:五折券,獲取助力碼后每邀請五位好友成功助力,即可獲得五折券一張,多分享多獲贈。
合宙商城五折券使用說明:
由合宙Luat公眾號菜單【合宙商城】進入,商城全場除團購、限量特價外均可使用。每個訂單結算限使用一張,每張券最多可購買相同或不同產品共計3個,不與其他優惠活動疊加。
- 合宙Cat.1技術QQ群 -
合宙Luat (Cat.1模塊) 1群:1092305811
合宙Luat (Cat.1模塊) 2群:8771645550
每個建議都值得關注
每個技能都值得分享
更多精彩等你來參與
千人級專業人士技術交流群,
模組開發、行業應用、知識分享包羅萬象,
談笑間輕松獲取最前沿最實用的物聯網資訊!
- 合宙Cat.1生態應用案例 -
柏來Cat.1智能充電插座
大彩科技醫用級4G串口屏
研色智能LED背包/車載互動屏
速銳得車聯網4G版T-BOX
米老師Cat.1電話核心板
世紀華寧Cat.1路由器&DTU
蜜連科技Cat.1智能口罩售賣機
總結
以上是生活随笔為你收集整理的日志中出现乱码_合宙Luat | 乱码搞得一团糟?开源神器帮你轻松修复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb.net2019- 机器学习ml.n
- 下一篇: java中字典算法_Java字典生成算法