今天由于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青年

关于gedit的编码问题相关推荐

  1. centos安装gedit

    yum install gedit yum install dconf-editor yum install x11-xserver-utils dconf-editor dbus-x11 -y xh ...

  2. Ubuntu下打开文件乱码及编码转换

    txt文件在Windows下可以正常显示,Ubuntu下打开文件乱码.这是中文编码问题,Windows下用的是gb2312,而linux下用的是utf8.在此提供5种解决方案: 1. 在文档所在目录运 ...

  3. windows文件中的中文在ubuntu下乱码(小弟参考了许多都不行,这个绝对行啊) .

    ubuntu默认的打开.txt文件用的是gedit,可gedit默认编码是UTF8,打开windows下编辑的gb2312的文档都是乱码.解决方法之一就是把gedit的编码改为GB2312,方法如下: ...

  4. windows文件(.txt,.h,.cpp等等)中的中文在ubuntu下乱码的解决方法

    ubuntu默认的打开.txt文件用的是gedit,可gedit默认编码是UTF8,打开windows下编辑的gb2312的文档都是乱码.解决方法之一就是把gedit的编码改为GB2312,方法如下: ...

  5. python判断汉字个数_python判断列表里数量python中文乱码问题大总结

    在运行这样类似的代码:#!/usr/bin/env python s="中文" print s 最近经常遇到这样的问题: 问题一:SyntaxError: Non-ASCII ch ...

  6. ubuntu系统下gedit 打开GBK字符集编码文件出现乱码问题解决办法

    使用 Gedit 打开 Windows 系统下编写的文本文件时,文件的中文全是乱码. 有些在Windows下能够打开的txt文件在Ubuntu下用gedit打开时,中文显示是乱码,这是因为编码方式不同 ...

  7. debian下gedit 打开GBK字符集编码文件出现乱码

    使用 Gedit 打开 Windows 系统下编写的文本文件时,文件的中文全是乱码. 有些在Windows下能够打开的txt文件在Ubuntu下用gedit打开时,中文显示是乱码,这是因为编码方式不同 ...

  8. 文件名转换为utf8 c语言,文件名编码转换:从 gb* 转向 utf8 必备工具 convmv

    帮助文档在 ,本文是翻译 convmv - converts filenames from one encoding to another 将文件名由一种编码转换为另一种编码 命令的用法与 iconv ...

  9. ubuntu如何修改字符集编码

    系统支持编码的修改如下: 1. 使用如下命令查看系统支持的字符集cat /usr/share/i18n/SUPPORTED说明:查看系统支持的字符集,你需要注意的是支持字符集的格式,如对中文会有以下一 ...

最新文章

  1. [JAVAEE] 理解“自然模板“+使用 ModelAndView 对象
  2. arduino 控制无刷电机_智能控制轮椅来了,残疾人的福音!
  3. order by总结
  4. 上云数据分析首选产品Quick BI的可视化之路
  5. 学习UpdatePanel控件
  6. python plotly spyder显示_Python绘图工具Plotly的简单使用
  7. vivo NEX 3 5G真机曝光:瀑布屏+升降镜头
  8. 互联网晚报 | 9/28星期三 | 微信退群可选保留聊天记录 ;iPhone 14 Pro被吐槽信号差;​贾跃亭率获1亿美元融资...
  9. 希尔伯特变换到底有什么用
  10. 人体的神经系统图 分布,人的神经系统分布图
  11. 高德地图的测试key_如何获取高德地图api key
  12. Had I not seen the Sun(如果我不曾见过太阳)
  13. 考研英国文学复习要点
  14. 京东云默默搞了个操作系统,惊艳了一大片煤矿
  15. 游戏测试内存泄露相关方案
  16. 如何把Scilab当成MATLAB来用
  17. python entry如何清空_Python tkinter,从类中清除Entry小部件
  18. laravel validator unique
  19. java给图片加水印_java中怎么样将水印加在图片的上面或者下面
  20. 寒武纪3款AI处理器齐发,陈天石3年小目标:占领10亿智能AI终端;占领中国AI云端高性能芯片1/3...

热门文章

  1. 请把ios文件解压出来是什么意思_【张小亮】最新版本行会3。中文版本。解压即玩。...
  2. 完整性校验用到常见的算法_几种常见的校验算法
  3. flowable springboot 集成 flowableDMN_05
  4. (需求实战_终章) SpringBoot2.x 整合RabbitMQ
  5. 使用wsimport将wsdl生成java
  6. Windows 环境 Jenkins集成构建SonarQube
  7. vue-datepicker的使用
  8. python 判断时间是否大于6点_python中判断时间间隔的问题
  9. python 打开pdf文件_Python3检验pdf文件是否有效
  10. linux xguest用户,在/etc/passwd中得到普通用户列表