關于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.pswp.cn/news/531401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531401.shtml
英文地址,請注明出處:http://en.pswp.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…