最近因为要使用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中显示的更多相关文章

  1. OLED液晶屏幕(2)取模软件

    https://blog.csdn.net/ling3ye/article/details/53399305 文件夹说明: Adafruit_SSD1306-master   ——SSD1306库(O ...

  2. Hibernate查询之SQL查询,查询结果用new新对象的方式接受,hql查询,通过SQL查询的结果返回到一个实体中,查询不同表中内容,并将查到的不同表中的内容放到List中

     package com.ucap.netcheck.dao.impl; import java.util.ArrayList;import java.util.List; import org. ...

  3. idea中maven项目放到包中的mapper的xml文件不发布的问题

    今天重新一下mybatis的基础,然后一直报错,提示的是 result map 找不到com.zm.model.User对象可是看 mapper的写法没问题.找了半天才发现 是mapper没扫描到 解 ...

  4. 17)将index.php中的代码放到Framework中封装起来

    目录结构: 发生改动的类代码: 新增类:Framework.class.php <?php /** * Created by PhpStorm. * User: Interact * Date: ...

  5. java 连接接数据库 中的代码 放到配置文件中

    1.DButil.java package com.jobproject.util; import java.sql.Connection;import java.sql.DriverManager; ...

  6. 获取项目中文件,存放到Debug中。

    说起这个,还真是费了一般功夫. 说个最简单的方法: 第一步:把需要生成到Debug中的文件放到项目中(注意:当前文件夹目录是什么样的,存放到Debug中也是什么样) 第二部:设置文件属性中 复制到输出 ...

  7. [zz]如何在C语言程序中处理汉字

    学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作.目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在print ...

  8. Protel中放置汉字工具的使用图示

    首先先到网上下载Protel中放置汉字工具ProtelHz.然后把ProtelHz中的文件全部解压到Protel99se安装目录X:\Program Files\Design Explorer 99 ...

  9. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

随机推荐

  1. 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询

    不要用GUID 当主键 没有规律 可以用雪花ID DBA 优化法则 硬件资源是根本,DBA是为了充分利用硬件资源 一般清空下可以不使用外键 可以提高性能 合理使用临时表 临时表分页; 一些查询语句加w ...

  2. C#中string类型必填的诡异问题

    背景 ASP.NETCore3.0项目,使用Swagger接口文档. 之前的项目都是Swashbuckle.AspNetCore-5.0.0 新项目想尝尝鲜,用最新版Swashbuckle.AspNe ...

  3. 为了搞清楚类加载,竟然手撸JVM!

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  4. java数组之binarySearch查找

    /** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...

  5. 解决使用Navicat等工具进行连接登录mysql的1521错误,(mysql为8.0版本)

    mysql 8.0的版本的加密方式和以前的不一样,因此使用Navicat等工具进行连接的时候,会报1521的异常. 解决方法如下: 登录mysql的命令行工具,输入如下代码: ALTER USER ' ...

  6. 使用postman添加cookie失败和cookie消失问题

    例如 groupId=2; path=/; domain=.www.baidu.com; HttpOnly; Expires=Tue, 16 Jul 2019 03:42:12 GMT; 添加失败和c ...

  7. git 知识点积累

    1.初始化指定目录作为git目录  git init newpro 2.git add xx.uve 3.克隆项目 git clone git clone git://github.com/schac ...

  8. Flink学习之路(一)Flink简介

    一.什么是Flink? Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,提供支持流处理和批处理两种类型应用的功能. 二.Flink特点 1.现有的开源计算方案,会把流处 ...

  9. python 3.6 导入c++dll所遇到的坑

    1 返回值在c++里面为const char*,python 接收实际上为int类型 原因:python默认返回值为int 解决方法: import ctypes import os CUR_PATH ...

  10. 数据库表空间收缩之pg_squeeze,pg_repack

    数据库表空间收缩之pg_squeeze,pg_repack 目录 数据库表空间收缩之pg_squeeze,pg_repack pg_squeeze1.2 原理 优点 安装 使用 pgstattuple ...