鎰熸仼鐩搁亣

缇庡ソ鐨勬椂鍏変笌澶у鐩镐即

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 | 乱码搞得一团糟?开源神器帮你轻松修复相关推荐

  1. 合宙Luat | VSCode全新LuatIDE插件版本发布,行业高效开发再添利器

    开源开放,敢为行业之先.继Luat/LuatOS之后,合宙再次创新推出VSCode超强Lua嵌入式开发IDE插件--LuatIDE,为行业发展再添利器. LuatIDE为开发者提供强大的集成式开发环境 ...

  2. 合宙Luat | 电源设计——模块应用必看的2个要点

    在模块应用设计中,电源设计是很重要的一部分. 由于射频发射时,会在短时间有一个较大电流的突发脉冲.在突发脉冲阶段内,电源必须能够提供高的峰值电流,不然有可能会引起供电电压的跌落.   而很多初学的朋友 ...

  3. 合宙Luat | 得Cat.1者得天下?万物互联又春风

    合宙Luat | 得Cat.1者得天下?万物互联又春风 SIM卡知多少 1.1 SIM卡基本概念 1.2 物联网卡与普通SIM卡的区分 1.3 VSIM.ESIM.插拔卡是什么 Cat.1模块产品线的 ...

  4. 合宙Luat | 最新网红Cat.1开发板全攻略【使用教程+注意事项+设计图纸】

    合宙Luat | 最新网红Cat.1开发板全攻略[使用教程+注意事项+设计图纸] 使用指南目录参考 特别注意事项 常见问题Q&A 很多朋友认识合宙,都源于合宙的Cat.1系列产品.Air724 ...

  5. 合宙Luat直播间即将开启,你揭开行业奥秘,让你快人一步。

    嗨~刚陪你们过儿童节 和你们一起成长的合宙Luat 又有新计划 -- 合宙Luat官方直播即将开启 - 敬请关注 - - 官方直播什么内容 - 可能是合宙研发动态 可能是新品发布资讯 可能是行业大咖分 ...

  6. 上海合宙Luat 模块 Air724开发板 入门指南(1)

    Air724 是上海合宙物联网于2020年3月下旬发布的一款基于UIS8910DM芯片组的物联网通讯模块. 模块通讯性能优越,符合Cat1通讯标准,支持最大下行速率 10Mbps 和最大上行速率5Mb ...

  7. 中文提交到git乱码_解决Git 中文乱码问题

    乱码情景对号入座和解决方案 乱码情景1 在cygwin中,使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\ ...

  8. mysql不同版本乱码_解决MySQL中文乱码以及版本不一致问题_MySQL

    一.导出数据 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MySQL Workbench 5.2.47. 我想把本机数据库内的 ...

  9. mysql数据库 中文乱码_数据库 MySQL中文乱码解决办法总结

    MySQL中文乱码解决办法 前言: MySQL是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1 ...

最新文章

  1. 【java】带时区的时间格式化
  2. .NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
  3. android远程命令行工具,Android 使用 adb命令 远程安装apk
  4. ubuntu 12.04 /sbin/ldconfig.real: /usr/local/lib/*.so.8 不是符号连接 解决办法
  5. grep, egrep
  6. HTTP--历史、组件系统
  7. Levenshtein编辑距离C++实现
  8. 【ASP.NET Web API教程】6.1 媒体格式化器
  9. Rayson API 框架分析系列之6: 客户端动态代理原理
  10. 通过Xshell连接VM中的Ubuntu虚拟机
  11. [06]python3 shutil高级文件操作模块
  12. 猿创征文|磁盘满的本质分析——磁盘空间满与inode节点满
  13. 【保研复习】C语言保研机试笔记
  14. 关于 石墨文档客户端 的案例分析
  15. linux中fflush函数和printf函数 【转】
  16. python简单名片管理器,一个简单的Python名片管理系统
  17. ROS: an open-source Robot Operating System
  18. java int溢出,结果只会保留低32位,高位会抛弃掉
  19. LibFuzzer学习(一):轻松找到心脏出血漏洞
  20. 阿里云申请域名过程记录

热门文章

  1. ansys 内聚力_内聚力 软件工程
  2. html侧滑菜单mui,mui侧滑菜单点击含有mui-action-menu类的控件无法实现侧滑
  3. linux 下邮件服务器,Linux 下搭建Postfix邮件服务器
  4. 计算机应用基础2010版知识点,2010计算机应用基础选择题(含答案版)重点.doc
  5. Java Hashtable rehash()方法与示例
  6. Java OutputStreamWriter flush()方法与示例
  7. JS的条形码和二维码生成
  8. 故障error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: “
  9. node.js入门小案例
  10. 计算机应用基础第二章,计算机应用基础第二章上机操作题