日韩综合网-日韩综合网站-日韩综合一区-日韩综合在线视频-色涩网站-色涩网站在线观看

C114通信網  |  通信人家園

技術
2010/3/4

嵌入式系統多語言文本解決方案

來源:維庫開發網  作者:李智敏,華清遠見嵌入式學院上海中心講師

在嵌入式系統開發中,某些產品可能會需要跨區域銷售,因此,通常會有多語言的需求。對于這一類多語言需求的解決,在嵌入式產品中有其特殊的地方。以下,給出一種可能的解決方案。

該方案的核心思想是為所有文本建立索引,通過索引可以得到特定語言的文字編碼,隨后通過該編碼獲得字庫資源,并進行輸出。在這過程中,唯一需要注意的是對于特殊的某些語言,如阿拉伯語等的處理。(阿拉伯語字符在連寫時,其形狀會發生變化。)

1. 字庫的建立:

文本最終都將輸出給用戶,因此,必須為文本內容指定字庫。本方案中采用UNICODE編碼字庫。字庫文件采用二進制存儲,按UNICODE編碼順序排列存儲點陣數據,點陣大小為24*24。

2. 文本資源文件:

文本資源文件描述了特定語言的文本內容,以及相關的字符編碼。例如對于Chinese.cfg文件來說,就保留了一個索引為1的文本,該文本內容為“確認”;相應對于English.cfg文件來說,必然會同樣有一個索引為1的文本,該文本內容為“Confirm”。通過對所有的文本建立索引并生成文本資源文件,就為最終的解決掃清了障礙。

文本資源文件采用二進制存儲。文件頭部16個字節為描述性信息,之后是文本映射表,緊跟映射表之后為文本的實際Unicode編碼。

3. 對文本資源文件進行描述的數據結構

typedef struct _txtres_fileheader {

LONG lFileType; //文件類型,0x2E434647='.CFG'

LONG lVersionNum; //適用版本,0x56313032='V102'

LONG lMapOffset; //偏移量,文件頭到文本映射區的偏移量

LONG lDataOffset; //偏移量,文件頭到文本數據區的偏移量

} APPTEXT_FILEHEADER;

4. 文本映射表結構

typedef struct _txtres_txtmap {

WORD wTextIndes; //當前文本的索引值

WORD wTextSize; //當前文本的Unicode編碼所占用的字節數

LONG lUnicodeOffset; //從文件頭到當前文本Unicode編碼存儲位置的偏移量

} TXTRES_TXTMAP;

5. 特殊語言(阿拉伯語等)的解決

特殊語言在連寫時可能發生變化,因此采用固定字庫可能無法解決該問題。針對這種狀況可以直接新增一個自定義字庫。以阿拉伯語為例,該字庫的處理過程如下:

a. 首先將阿拉伯的文本內容按預定格式(例如24*24)在windows系統上顯示輸出,并將內容保存為圖片格式。此時圖片中便為連寫內容。

b. 隨后,對圖片進行分割。如按照24*24進行分割便可得到特定的24*24大小的字庫內容。

c. 最后,將原先的UNICODE編碼轉為按照之前生成的字庫來編碼。

d. 之后在程序代碼中就可利用自定義字庫與自定義編碼來顯示阿拉伯語。

最后附上部分示例代碼。

//定義文本配置文件路徑

#define TXT_FILE_ENGLISH "config/English.cfg"

#define TXT_FILE_CHINASIM "config/ChinaSim.cfg"

#define TXT_FILE_CHINATRA "config/ChinaTra.cfg"

#define TXT_FILE_KOREAN "config/Korean.cfg"

#define TXT_FILE_JAPANESE "config/Japanese.cfg"

#define TXT_FILE_SPANISH "config/Spanish.cfg"

#define TXT_FILE_RUSSIAN "config/Russian.cfg"

#define TXT_FILE_THAI "config/Thai.cfg"

#define TXT_FILE_GERMAN "config/German.cfg"

#define TXT_FILE_FRANCE "config/France.cfg"

#define TXT_FILE_ITALY "config/Italy.cfg"

#define TXT_FILE_ARABIA "config/Arabia.cfg"

#define TXT_FILE_PORTUGAL "config/Portugal.cfg"

#define TXT_FILE_HINDI "config/Hindi.cfg"

#define TXT_FILE_TURKISH "config/Turkish.cfg"

#define TXT_FILE_VIETNAM "config/Vietnam.cfg"

#define TXT_FILE_SWIDISH "config/Swedish.cfg"

#define TXT_FILE_POLISH "config/Polish.cfg"

//根據文本索引及文本語言,讀取相應的文本配置文件,以得到該文本,成功返回有效指針

GUISTRING * GetTextResource(LONG lIndex, LONG lLanguage)

{

GUISTRING * pTxt;

APPTEXT_FILEHEADER fh;

APPTEXT_MAPPING map;

STRING strFile;

WORD * pBuf;

int fd, iOff;

//確定要讀取的配置文件

switch (lLanguage)

{

case TXT_LANG_ENGLISH:

strFile = TXT_FILE_ENGLISH;

break;

case TXT_LANG_CHINASIM:

strFile = TXT_FILE_CHINASIM;

break;

case TXT_LANG_CHINATRA:

strFile = TXT_FILE_CHINATRA;

break;

case TXT_LANG_KOREAN:

strFile = TXT_FILE_KOREAN;

break;

case TXT_LANG_JAPANESE:

strFile = TXT_FILE_JAPANESE;

break;

case TXT_LANG_SPANISH:

strFile = TXT_FILE_SPANISH;

break;

case TXT_LANG_RUSSIAN:

strFile = TXT_FILE_RUSSIAN;

break;

case TXT_LANG_THAI:

strFile = TXT_FILE_THAI;

break;

case TXT_LANG_GERMAN:

strFile = TXT_FILE_GERMAN;

break;

case TXT_LANG_FRANCE:

strFile = TXT_FILE_FRANCE;

break;

case TXT_LANG_ITALY:

strFile = TXT_FILE_ITALY;

break;

case TXT_LANG_ARABIA:

strFile = TXT_FILE_ARABIA;

break;

case TXT_LANG_PORTUGAL:

strFile = TXT_FILE_PORTUGAL;

break;

case TXT_LANG_HINDI:

strFile = TXT_FILE_HINDI;

break;

case TXT_LANG_TURKISH:

strFile = TXT_FILE_TURKISH;

break;

case TXT_LANG_VIETNAM:

strFile = TXT_FILE_VIETNAM;

break;

case TXT_LANG_SWIDISH:

strFile = TXT_FILE_SWIDISH;

break;

case TXT_LANG_POLISH:

strFile = TXT_FILE_POLISH;

break;

default:

return NULL;

}

//打開配置文件并檢查其格式

if ((fd = open(strFile, O_RDONLY)) == -1)

{

return NULL;

}

if (read(fd, &fh, 16) != 16)

{

close(fd);

return NULL;

}

if (fh.lFileType != 0x4746432E || fh.lVersionNum != 0x32303156)

{

close(fd);

return NULL;

}

//在文本映射區內查找匹配的文本索引

for (iOff = fh.lMapOffset; iOff < fh.lDataOffset; iOff += 8)

{

if (read(fd, &map, 8) != 8)

{

close(fd);

return NULL;

}

if (map.wTextIndex == lIndex)

{

break;

}

}

if (iOff >= fh.lDataOffset)

{

close(fd);

return NULL;

}

//根據找到的文本映射來讀取文本內容

if (!(pBuf = GuiMemAlloc(map.wTextSize + 2)))

{

close(fd);

return NULL;

}

lseek(fd, fh.lDataOffset + map.lTextOffset, SEEK_SET);

if (read(fd, pBuf, map.wTextSize) != map.wTextSize)

{

GuiMemFree(pBuf);

close(fd);

return NULL;

}

pBuf[map.wTextSize >> 1] = 0;

//建立字符串對象

pTxt = CreateStringDirect(pBuf);

GuiMemFree(pBuf);

close(fd);

return pTxt;

}

//定義與字符串相關的數據結構

#ifndef GUI_STRING_STRUCT

typedef struct _string

{

WORD wWidth; //字符串寬度,字符串輸出時的總點陣寬度

WORD wLength; //字符串長度,不包括'\0'

WORD * pContent; //字符串內容,以'\0'結尾

} GUISTRING;

//結束與字符串相關的數據結構的定義

#define GUI_STRING_STRUCT

#endif

/***

* 功能:

根據指定的信息直接建立字符串,函數返回字符串指針

* 參數:

1.WORD * pContent: 字符串內容

* 返回:

成功返回字符串指針

失敗返回NULL

* 備注:

***/

GUISTRING * CreateStringDirect(WORD * pContent)

{

GUISTRING * pStr;

//嘗試為字符串分配內存

if (!(pStr = GuiMemAlloc(sizeof(GUISTRING))))

{

PRINT_INF(CreateStringDirect Err0!);

return NULL;

}

//字符串內容為空,建立一個空字符串對象

if (!pContent)

{

pStr->wWidth = 0;

pStr->wLength = 0;

pStr->pContent = NULL;

return pStr;

}

//統計字符串長度

pStr->wLength = 0;

pStr->pContent = pContent;

while (*pStr->pContent++)

{

pStr->wLength++;

}

//嘗試為字符串內容分配內存

if (!(pStr->pContent = GuiMemAlloc((pStr->wLength + 1) << 1)))

{

GuiMemFree(pStr);

PRINT_INF(CreateStringDirect Err1!);

return NULL;

}

//寫入字符串內容

memcpy(pStr->pContent, pContent, (pStr->wLength + 1) << 1);

//計算字符串寬度

if (_StringObjectFill(pStr))

{

GuiMemFree(pStr->pContent);

GuiMemFree(pStr);

PRINT_INF(CreateStringDirect Err2!);

return NULL;

}

return pStr;

}

“本文由華清遠見http://www.embedu.org/index.htm提供”

 

給作者點贊
0 VS 0
寫得不太好
熱門文章
    最新視頻
    為您推薦

      C114簡介 | 聯系我們 | 網站地圖 | 手機版

      Copyright©1999-2025 c114 All Rights Reserved | 滬ICP備12002291號

      C114 通信網 版權所有 舉報電話:021-54451141

      主站蜘蛛池模板: 老色99久久九九精品尤物 | 加勒比综合 | 成人做爰全过程免费看网站 | 日本一本久 | 大尺度福利视频在线观看网址 | 国产亚洲精品线观看77 | 成人www视频网站免费观看 | 萌白酱福利视频在线网站 | 亚洲国产2017男人a天堂 | 国产亚洲精品自在久久77 | 色樱桃影院亚洲精品影院 | 欧美色爱综合 | 国产女人在线视频 | 亚洲偷偷自拍 | 欧美日韩亚洲国产 | 国产精品手机在线播放 | 美国的毛片免费的 | 成人欧美一区二区三区黑人免费 | 91久久国产综合精品女同我 | 亚洲 欧美 精品 中文第三 | 91碰碰| 日本在线免费观看视频 | 91精品久久久久久久久久 | 国产精品黄网站免费进入 | 日本久久久久久久久久 | 国产欧美一区二区三区久久 | 伊人婷婷色香五月综合缴激情 | 成人在线免费视频 | 欧美成人性色生活片免费在线观看 | 韩国一级毛片大全女教师 | 欧美手机手机在线视频一区 | 欧美成人视屏 | 高清国产美女一级a毛片 | 男人免费看片 | 亚洲视频 在线观看 | 明星国产欧美日韩在线观看 | 亚洲国产国产综合一区首页 | 欧美精品免费在线 | 波多野结衣中文无毒不卡 | 99在线播放视频 | 性做久久久久免费观看 |