关于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青年

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值