unicode轉GBK,GNK轉unicode,解決FATFS中文碼錶佔用ROM問題

來源:互聯網
上載者:User

之前一直使用的512KB ROM的STM32,但是最近使用的只有128KB,想用FATFS顯示支援長檔名,發現添加CC936.C後ROM肯定不夠的,就決定將這個雙向碼錶儲存到外部儲存空間中,flash或者SD卡都行,只有能讀就行;

更改後的CC936.C中的編碼轉換函式
WCHAR ff_convert ( /* Converted code, 0 means conversion error */
WCHAR src,
/* Character code to be converted */
UINT dir
/* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
WCHAR c;

if (src < 0x80) {
/* ASCII */
c = src;

else 
{
if (dir) 
{ /* OEMCP to unicode */

c = GBKtoUNICODE(src);

else 
{ /* Unicode to OEMCP */
; c = UNICODEtoGBK(src);
}
}

return c;
}

刪掉那兩個碼錶後,代碼瞬間減小了幾百KB了.

//我使用的是W25X16
//儲存位置說明
//0x00 ~ 0xbc00
存放  
UtoG.sys  42kb
//0xc000 ~
0x17c00  
存放   GtoU.sys
 47kb
//0x18000 ~
0xd3800 存放
12x12.ttf 750kb
//0xd3c00 ~
0x18f400 存放
16x16.ttf 750kb

//各檔案基址
#define CODE_UtoG_BASE (0x00)
  //unicode轉GBK碼錶
#define CODE_GtoU_BASE (0xC000)
//GBK轉unicode碼錶
#define FONT_12X12_BASE (0x18000)
//12x12GBK字型檔
#define FONT_16X16_BASE (0xd3c00)
//16x16GBK字型檔

下面看這兩個函數的實現方式

/*************************************************************************************************************************
* 函數 :
u16 GBKtoUNICODE(u16 GBKCode)
* 功能 :
將GBK編碼轉換為unicode編碼
* 參數 :
GBK
* 返回 :
unicode
* 依賴 :
底層讀寫函數
* 作者 :
陳鵬
* 時間 :
20120602
* 最後修改時間 : 20120602
* 說明 : 需要flash中的碼錶支援
GBK碼範圍,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/ 
u16 GBKtoUNICODE(u16 GBKCode)
{
u16 unicode;
u8 buff[2];
u16 *p;
u8 ch,cl;

ch = GBKCode >> 8;
cl = GBKCode & 0x00ff;

//計算位移
if(cl < 0x7f)
unicode = (ch-0x81)*190+cl-0x40;
if(cl > 0x80)
unicode = (ch-0x81)*190+cl-0x41;
unicode *= 2;

W25X16_Read(buff,CODE_GtoU_BASE + unicode,2) ; //讀取碼錶

p = (u16 *)buff;
return *p;
}

/*************************************************************************************************************************
* 函數 :
u16 UNICODEtoGBK(u16 unicode)
* 功能 :
將unicode編碼轉換為GBK編碼
* 參數 :
unicode
* 返回 :
GBK
* 依賴 :
底層讀寫函數
* 作者 :
陳鵬
* 時間 :
20120602
* 最後修改時間 : 20120602
* 說明 : 需要flash中的碼錶支援
GBK碼範圍,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/ 
u16 UNICODEtoGBK(u16 unicode)  //用二分尋找演算法
{
u32 offset;
u8 temp[2];
u16 res;
if(unicode<=0X9FA5)offset=unicode-0X4E00;
else if(unicode>0X9FA5)//是標點符號
{
if(unicode<0XFF01||unicode>0XFF61)return 0;//沒有對應編碼
offset=unicode-0XFF01+0X9FA6-0X4E00;    
}  
W25X16_Read(temp,offset*2+CODE_UtoG_BASE,2);//得到GBK碼   
res=temp[0];
res<<=8;
res+=temp[1];
 
return res ; //返回找到的編碼
}

只要根據自己使用的儲存空間更改W25X16_Read()這個底層IO介面就行了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.