将汉字取模软件中的汉字放到keil5中显示
最近因为要使用STM32做毕业设计,需要用LCD显示中文,STM32开发板用的是原子的战舰STM32开发板,给的LCD显示例程里貌似没有中文显示,那么需要自己去编写中文显示程序。
软件编写对我来说并不是什么难事,关键就是在这个过程中遇到了一个非常奇葩的问题。
我用的取模软件是PCtoLCD2002.exe,这在很多地方都能找到。生成字模后,在每一个字模的最后有对应的中文注释,但是将生成的字模复制到程序中发现一个问题,中文显示成了问号,显示如下:
我想,这很简单,无非就是中文编码格式不一样嘛,新建一个文本文档,然后用notepad++打开,将生成的字模粘贴进去,发现可以正常显示:
然后看一下它的编码格式,发现是UTF-8编码:
这意味着在keil5里使用UTF-8编码就可以正常显示了,在keil5菜单栏点击Edit->Configuration:
在弹出的框中发现keil5中是用ANSI解码的,现在我们换成UTF-8解码,然后点击OK:
完了之后会发现,刚刚复制过来的字模,中文注释怎么还是一个问号啊,别着急,这是因为,之前将UTF-8的编码内容复制进了ANSI解码的文档中,keil5会将无法解码的部分直接替换成一个问号,也就是说,此时keil5中这个问号并不是乱码,这是一个真真正正的问号啊。(这里有必要提一下,为什么只有中文乱码了而英文和数字没有乱码,那是因为英文和数字都是用ASCLL编码的,而ASCLL码是所有编码的一个子集,也就是说,无论你用什么方式编码,ASCLL码那部分都是不会乱码的。)OK,接下来要解决这个问题也很简单,将复制过来的字模删掉,然后重新粘贴,因为这时keil5已经是用UTF-8解码的了,所以是能够正常显示UTF-8编码的中文了:
等等,我好像发现了什么,虽然复制过来的字模可以显示成中文了,但是之前的中文注释好像乱码了:
好吧,因为我需要参考很多原子的例程,那么我们还是将keil5的解码方式改回ANSI。那么又如何能正常显示从字模软件里拷贝过来的中文注释呢,很简单,只要转换就好了啊,notepad++就有这个功能。我将拷贝的字模放在新建的文本文档中,然后用notepad++打开,这时可以看到notepad++中用的是UTF-8编码,并且能够正常显示。
这时我将文件转为ANSI编码:
然后再将转换过后的文字复制进keil5,这时迷惑的事情来了,keil5中显示的还是一个问号。经过核对之后能保证在notepad++中使用的已经是ANSI编码了,而且keil5中也是使用ANSI解码的,但为什么keil5中还是显示问号呢,肯定是某个环节有问题。这时我做了个实验,在keil5中将解码方式设置成了UTF-8,然后再将notepad++中以ANSI编码的汉字复制进keil5中,发现能正常显示,这能说明notepad++没有成功转码吗?既然如此,我们再在notepad++上以UTF-8解码,发现在notepad++上不能正常显示中文:
这说明notepad++上的ANSI编码和keil5上的ANSI解码不一致???
经过查阅资料后发现尼玛ANSI真的不是一种统一标准,但他们都会对应一种真实编码,参考:
https://blog.csdn.net/weixin_30216561/article/details/99139847
而在网上搜“ANSI编码表”也确实找不到具体的编码表,这一点也可以佐证ANSI不是一种具体的编码。但还有一个疑问就是,即使ANSI不是一种具体编码,但在同一台电脑上那应该是同一种编码吧。干脆用最直接的方式来验证,notepadd++和keil5中使用的ANSI编码到底对应了哪一种真实编码。我们在notepad++和keil5中打开的文档中都使用ANSI编码,并且删掉所有的内容,只留下一个“拨”字,然后分别保存这两个文件,接下来用另一个强大的工具,winhex来打开他们,我们发现在keil5中编辑的“拨”字和notepad++中编辑的“拨”字,他们对应的编码:
都是B2A6………………….(陷入沉思)
并且可以查到,B2A6如果代表的是汉字的“拨”,那么它对应的真实编码就是GBK编码:
好吧,这让我很惆怅,想来想去,发现中间确实有一环是不严谨的,之前将notepad++和keil5都设置成ANSI编码的时候,我是将notepad++中的字复制到keil5中发现显示问号,这次我是直接在keil5中用键盘打出了“拨”这个字,因此我要将notepad++中的“拨”字复制到keil5中去。操作之后,发现在keil5中,真的就显示成了一个问号,保存keil5中的文件再用winhex查看的时候,发现编码已经变成3F了,而3F正是ASCLL码表中的问号。
OK,既然这样,我将keil5中的“拨”字拷贝到notepad++中会怎样呢。结果,它变成了这样:
什么?????keil5中用ANSI编码的B2A6复制到notepad++中,notepad++也为ANSI编码,结果却变成了327C?那么B2A6和327C又有什么联系呢。为了进一步验证,我将keil5中的“寒武纪奥陶纪志留纪泥盆纪石炭纪侏罗纪”复制到notepad++中,发现它变成了这样:
进一步验证发现keil5中的一个汉字复制到notepad++中并不一定是2个字节对应2个字节,而且变化后的字节以问号居多,而从notepad++中拷贝到keil5中的汉字则全部变成问号。
总之一句话就是“你没问题,我也没问题,是复制粘贴这个操作有问题”,而且测试发现使用键盘复制和使用鼠标数字是一样的结果。
经过了半个小时的休息,我想问题仍然在ANSI这种特殊编码之上,如果我将编码改为GBK编码,是不是就好了呢,然鹅keil5中没有GBK编码的选项,只有GB2312编码(这里需要提一下的是,GBK编码比GB2312编码收录了更多的汉字,而且可以认为GB2312编码是GBK编码的子集,常用汉字用GB2312编码就够够的了)将keil5中的编码方式改为GB2312。发现原子的例程中文注释并没有乱码,然后在字模软件中将字模复制,在nodepad++中粘贴,注意这时notepad++中使用的是UTF-8编码,然后再转为ANSI编码,然后再复制,再到keil5中粘贴,这时,便不再乱码。更神奇的是,当keil5中使用GB2312编码时,将取模软件中的UTF-8编码的汉字直接复制到keil5中,竟然直接被转成了GB2312,好吧。。。
虽然问题解决了,但是用ANSI编码的文件中的汉字不能互相复制粘贴的原因还是没有找到。
将汉字取模软件中的汉字放到keil5中显示的更多相关文章
- OLED液晶屏幕(2)取模软件
https://blog.csdn.net/ling3ye/article/details/53399305 文件夹说明: Adafruit_SSD1306-master ——SSD1306库(O ...
- Hibernate查询之SQL查询,查询结果用new新对象的方式接受,hql查询,通过SQL查询的结果返回到一个实体中,查询不同表中内容,并将查到的不同表中的内容放到List中
package com.ucap.netcheck.dao.impl; import java.util.ArrayList;import java.util.List; import org. ...
- idea中maven项目放到包中的mapper的xml文件不发布的问题
今天重新一下mybatis的基础,然后一直报错,提示的是 result map 找不到com.zm.model.User对象可是看 mapper的写法没问题.找了半天才发现 是mapper没扫描到 解 ...
- 17)将index.php中的代码放到Framework中封装起来
目录结构: 发生改动的类代码: 新增类:Framework.class.php <?php /** * Created by PhpStorm. * User: Interact * Date: ...
- java 连接接数据库 中的代码 放到配置文件中
1.DButil.java package com.jobproject.util; import java.sql.Connection;import java.sql.DriverManager; ...
- 获取项目中文件,存放到Debug中。
说起这个,还真是费了一般功夫. 说个最简单的方法: 第一步:把需要生成到Debug中的文件放到项目中(注意:当前文件夹目录是什么样的,存放到Debug中也是什么样) 第二部:设置文件属性中 复制到输出 ...
- [zz]如何在C语言程序中处理汉字
学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作.目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在print ...
- Protel中放置汉字工具的使用图示
首先先到网上下载Protel中放置汉字工具ProtelHz.然后把ProtelHz中的文件全部解压到Protel99se安装目录X:\Program Files\Design Explorer 99 ...
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
js replace 全局替换 js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...
随机推荐
- 钩子与API截获
http://www.pudn.com/Download/type/id/19.html
- Java 持久层框架之 MyBatis
MyBatis 简介 MyBatis 是一个基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动.创建 Connection.配 ...
- java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列
1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...
- python列表(九)元组
元组 元组是不可变序列,元组一旦创建,用任何方法都不可以修改其元素. 元组的偶有元素是放在一对圆括号"()"中 1.元组创建与删除 使用"="讲一个元组赋值给变 ...
- python初学者-判断一个数是否为素数
while True: #判断为真 num = int(input('请输入一个数:')) for i in range(2,num):#判断在num之前的数能不能把num整除 if(num%i == ...
- python初学者-从小到大排序
x=input("x=") y=input("y=") z=input("z=") if x>y: x,y=y,x if x>z ...
- Centos7 根目录存储空间扩展方法
Centos7 根目录存储空间扩展方法 一.首先通过 df -hl 命令查看磁盘占用情况,其中根目录已经被占满,此时需要对其进行扩容 二.针对虚拟机环境的centos7系统根存储空间扩容,可利 ...
- JPA 复杂查询 - Querydsl
添加依赖 <!--query dsl --> <dependency> <groupId>com.querydsl</groupId> <art ...
- Vue开发中的一些常见套路和技巧
属性排放 export default { name: '名称', components: { // 组件挂载a}, created(){} // 数据获取 beforeMount() {}, // ...
- harbor安装实操笔记
纸上得来终觉浅,实操一遍吧! 把所有开发的后端服务先在打成镜像,传到私有镜像仓库: 然后在任意的远程机器拉取镜像,然后可采用docker或者docker-compose的方式运行,本节先按照docke ...