关于gedit的编码问题

今天由于gedit的编码格式导致LCD显示屏的问题,开始没有想到后来才发现,在这记录一下

#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/ipc.h>#define FB_NAME     "/dev/fb0"   //打开的帧缓冲设备名
unsigned char *fbp = 0;          //文件映射的虚拟地址指针
long screensize;                 //没帧图像的大小
struct fb_var_screeninfo vinfo;  //打开的帧缓冲设备的可变参数
struct fb_fix_screeninfo finfo;  //打开的帧缓冲设备的不可变参数
int  fp;                         //打开的文件描述符void show_point(unsigned int x, unsigned int y, unsigned int c)
{unsigned int location;//每个像素点的位数/8=每个像素占用的字节数location = x * (vinfo.bits_per_pixel / 8) + y  *  finfo.line_length;/*直接赋值来改变屏幕上某点的颜色注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2 字节,比如RGB565,则需要进行转化*/*(fbp + location)     = c     & 0xff;    /* 蓝色的色深 */  *(fbp + location + 1) = c >> 8  & 0xff;  /* 绿色的色深*/ *(fbp + location + 2) = c >> 16 & 0xff;  /* 红色的色深*/*(fbp + location + 3) = c >> 24 & 0xff;  /* 是否透明*/
}
int fB_init (void)
{fp = open (FB_NAME, O_RDWR);if (fp < 0) {printf("打开帧缓冲设备失败\r\n");return -1;}printf("打开帧缓冲设备成功\r\n");if (ioctl(fp, FBIOGET_FSCREENINFO, &finfo)) {printf("获得帧缓冲设备的固定参数失败\r\n");return -1;}	if (ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)) {printf("获得帧缓冲设备的可变参数失败\r\n");return -1;}printf("识别到当前屏幕尺寸为:%d*%d   色深:%d\r\n",vinfo.xres,vinfo.yres,vinfo.bits_per_pixel);// 计算单帧画面占多少字节screensize = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel / 8);  //把fp所指的文件中从开始到screensize大小//的内容给映射出来,得到一个指向这块空间//的指针fbp = (unsigned char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp, 0);if (NULL == fbp) {printf ("把文件映射到虚拟内存失败\r\n");return -1;}return 0;}
void fb_close(void )
{munmap (fbp, screensize); /*解除映射*/close (fp);               /*关闭文件*/
}void Read_from_HZK16( const unsigned char *s, char*  chs)
{FILE *fp;unsigned long offset;//根据内码找出汉字在HZK16中的偏移位置offset = ((s[0] - 0xa1) * 94 + (s[1] - 0xa1)) * 32;printf("s[0]=%d\n",s[0]);printf("s[1]=%d\n",s[1]);printf("offset=%d\n",offset);//打开字库文件if((fp = fopen("HZK16", "r")) == NULL)return;                                 //文件指针偏移到要找的汉字处fseek(fp, offset, SEEK_SET);  //读取该汉字的字模fread(chs, 32, 1, fp);                      fclose(fp);
}void show_chinese_16x16(unsigned int x, unsigned int y, unsigned int fc, unsigned int bc,  const unsigned char * chs)
{int i, j;char data[32];Read_from_HZK16(chs, data);      //去字库中读取汉字字模for (i = 0; i < 32; i++)         //显示32个点{if (i % 2 == 0)y++;                     //每行两字节,16X16点阵for (j = 7; j >= 0; j--) {if (data[i] & (0x1 << j))//描绘前景色 {show_point(x + (7 - j) + (i % 2) * 8, y, fc); //由高到低,} else                     //描绘背景色;{               show_point(x + (7 - j) + (i % 2) * 8, y, bc);}}}
}
int main(void)
{fB_init ();                    //初始化帧缓冲设备show_chinese_16x16(0, 0, 0xf80000ff, 0x0, "中");show_chinese_16x16(16, 0, 0xf80000ff, 0x0, "华");fb_close();						//关闭帧缓冲设备return 0;
}

上面是我在tiny4412开发板上测试LCD屏的代码,但是当我改变显示的数据时出现了问题,显示的不是我想显示的字,很奇怪啊!为什么会这样,两个一模一样的代码却表现出来不一样的结果。

开始考虑是从字库取模时的问题,但是仔细检查并没有发现错误,然后把正确代码和错误代码的偏移量打印出来,仅仅看出来两个的偏移量不同,目前为止还是找不到原因。

从串口的显示发现了端倪,看图:
在这里插入图片描述
一模一样的代码,为什么一个是正确,一个是乱码,考虑是我使用gedit编辑保存的,应该是编码格式的问题,修改文件的编码格式

在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。
iconv命令用法如下:

iconv [选项...] [文件...]
  • 1.输入/输出格式规范:
      -f, --from-code=名称 原始文本编码
      -t, --to-code=名称 输出编码

  • 2.列举所有已知的字符集  -l, --list

  • 3.输出控制:
      -c   从输出中忽略无效的字符
      -o, --output=FILE   输出文件
      -s, --silent   关闭警告
      --verbose   打印进度信息

例子:

iconv -f utf-8 -t gb2312  e_book.c> e_book1.c
mv e_book1.c e_book.c

修改字符编码后查看

file e_book.c

如图:
在这里插入图片描述
此时再次显示就正确了。
在这里插入图片描述


本文章仅供学习交流用禁止用作商业用途,文中内容来水枂编辑,如需转载请告知,谢谢合作

微信公众号:zhjj0729

微博:文艺to青年

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言表白程序代码

双十一要到了&#xff0c;好激动啊&#xff01;&#xff01;&#xff01; 是时候准备出手了&#xff01; 花了一天的时间写的表白代码。 表示自己弱弱的..... 看了网上好多都是js写的&#xff0c;感觉碉堡了&#xff01;js用的不熟&#xff0c;前端不好&#xff0c;java&#x…

tiny4412移植tslib库

1、将tslib-1.4.tar.gz拷贝到虚拟机某个路径进行解压 2、进入解压路径tslib 3、执行#./autogen.sh 如果提示&#xff1a;./autogen.sh: 4: ./autogen.sh: autoreconf: not found 原因&#xff1a;没有安装automake工具, 解决办法:需要安装此工具&#xff1a; apt-get instal…

移植QT到tiny4412开发板

目录&#xff08;一&#xff09; 环境准备&#xff08;二&#xff09; Qt源代码下载&#xff08;三&#xff09; 移植tslib库&#xff08;四&#xff09;操作流程1.解压qt源码包2.配置编译环境3.生成Makefile4.编译安装5.安装一些库用来支持 qt6. 添加以下内容到开发板目录下的…

c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)

一. sizeof计算结构体 注&#xff1a;本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std;class Parent{ public:void fun(){cout<<"Parent fun"<<endl;} }; class Child : public Parent{ public:void fun(){…

嵌入式面试题(一)

目录1 关键字volatile有什么含义&#xff1f;并给出三个不同的例子2. c和c中的struct有什么不同&#xff1f;3.进程和线程区别4.ARM流水线5.使用断言6 .嵌入式系统的定义7 局部变量能否和全局变量重名&#xff1f;8 如何引用一个已经定义过的全局变量&#xff1f;9、全局变量可…

能ping通ip但无法ping通域名和localhost //ping: bad address 'www.baidu.com'

错误描述&#xff1a; ~ # ping localhost ping: bad address localhost原因&#xff0c;在/etc目录下缺少hosts文件&#xff0c;将linux中的/etc hosts文件拷入即可 ~ # ping localhost PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq0 ttl64 tim…

eclipse导入web项目之后项目中出现小红叉解决办法

项目中有小红叉我遇到的最常见的情况&#xff1a; 1、项目代码本身有问题。&#xff08;这个就不说了&#xff0c;解决错误就OK&#xff09; 2、项目中的jar包丢失。&#xff08;有时候eclipse打开时会出现jar包丢失的情况&#xff0c;关闭eclipse重新打开或者重新引入jar包就O…

arm开发板通过网线连接笔记本电脑上外网

需要工具&#xff1a;arm开发板&#xff0c;网线&#xff0c;一台双网卡的win7笔记本电脑&#xff08;笔记本电脑一般都是双网卡&#xff09; 一、笔记本电脑需要先连上外网&#xff0c;可以连上家里的WIFI&#xff0c;或者手机开热点&#xff08;本人未测试过连接手机的热点&…

windows下实现Git在局域网使用

1.首先在主机A上创建一个文件夹用于存放你要公开的版本库。然后进入这个文件夹&#xff0c;右键->Git create repository here&#xff0c;弹出的窗口中勾选Make it Bare&#xff01;之后将这个文件夹完全共享&#xff08;共享都会吧&#xff1f;注意权限要让使用这个文件夹…

解决linux下QtCreator无法输入中文的情况

安装了QtCreator(Qt5.3.1自带版本)后无法输入中文&#xff0c;确切的说是无法打开输入法。以前使用iBus输入法的时候没有这个问题&#xff0c;现在使用sougou输入法才有的这个问题。 可以查看此文 http://www.cnblogs.com/oloroso/p/5114041.html 原因 有问题就得找原因&…

lintcode 滑动窗口的最大值(双端队列)

题目链接&#xff1a;http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组&#xff0c;和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口&#xff0c;找到数组中每个窗口内的最大值。 样例 给出数组 [1…

你的main函数规范吗?

在学习c语言的时候&#xff0c;有一个函数一直被我们使用&#xff0c;那就是main函数&#xff0c;但是你知道标准里面是怎么规定它的写法吗&#xff1f; 平时看见的main函数有下面这几种&#xff1a; 1.int main(void){ }2.int main(){ }3.int main(int argc, char *argv[])…

lintcode 最长上升连续子序列 II(二维最长上升连续序列)

题目链接&#xff1a;http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 II 给定一个整数矩阵&#xff08;其中&#xff0c;有 n 行&#xff0c; m 列&#xff09;&#xff0c;请找出矩阵中的最长上升连续子序列。&a…

适用于Linux的Windows子系统WSL

以前使用的都是在虚拟机里安装linux&#xff0c;最近才发现在win10提供了WSL(Windows Subsystem for Linux) &#xff0c;简单来说就是可以在win10里面直接使用Linux。 &#xff08;一&#xff09;首先打开Microsoft Store , 搜索 Linux &#xff08;二&#xff09;选择自己需…

jsp通过易宝方式实现在线支付

项目下载地址: https://github.com/hjzgg/OnlinePayment 参考&#xff1a;http://blog.csdn.net/jadyer/article/details/7380259?utm_sourcetuicool&utm_mediumreferral 效果图1&#xff1a;请求界面 效果图2&#xff1a;地支付请求和易宝之间建立连接之后跳转到相应的银…

permission denied是什么鬼?

问题&#xff1a;在PC端编译了一个arm芯片的测试程序&#xff0c;出现了permission denied 解决办法&#xff1a; 1.给文件赋予可执行权限 chmod ax xxx这是一般第一反应会想到的答案 2. 有时候已经有可执行权限&#xff0c;还是提示上面的错误此时要注意你的交叉编译器是否正…

CSS中div覆盖另一个div

将一个div覆盖在另一个div上有两种手段&#xff1a;一是设置margin为负值&#xff0c;二是设置绝对定位。 可以根个人情况设置z-index的值 1->position 为absolute的情况 <html> <head> <style> #div1{position:absolute;width:300px;height:300px;backgr…

nand flash和nor flash的这几点区别你知道吗?

这篇文章讲解nand flash和nor flash的特点和区别&#xff0c;不涉及存储原理的讲解 &#xff08;一&#xff09;Flash简介 FLASH是一种存储芯片&#xff0c;全名叫Flash EEPROM Memory&#xff0c;通地过程序可以修改数据&#xff0c;即平时所说的“闪存”。Flash又分为NAND f…

c++堆

c reference: http://www.cplusplus.com/reference/algorithm/make_heap/ heap并不属于STL容器组件&#xff0c;它分为 max heap 和min heap&#xff0c;在缺省情况下&#xff0c;max-heap是优先队列&#xff08;priority queue&#xff09;的底层实现机制。 而这个实现机制中的…

关于Ubuntu拒绝root用户ssh远程登录

今天使用SecureCRT远程登陆Ubuntu时一直提示密码或用户名错误&#xff0c;实际输入是正确的&#xff0c;我按照网上教程改还是不行&#xff0c;后来才想起来我是root登录的&#xff0c;Ubuntu默认的ssh远程root登录是关闭的&#xff0c;在这里记录一下 1.编辑配置文件 #sudo v…