?? english_chinese_test.c
字號:
#define __linux__#ifdef WIN32#include <windows.h>#include <tchar.h>#include <conio.h>#endif#include <stdio.h>#include <string.h>#include <stdlib.h>#include "GBGlobal.h"#define CP_GB 936#ifdef __linux__#include <locale.h>#include <stdio.h>#include <sys/ioctl.h>#include <termios.h>#define VK_ESCAPE 13#define VK_RETURN 27#define VK_BACK 8#define _wcstombs(mbs, wcs, mbslen) wcstombs(mbs, wcs, mbslen)#else#define _wcstombs(mbs, wcs, mbslen) WideCharToMultiByte(CP_ACP, 0, wcs, wcslen(wcs) + 1, mbs, mbslen, NULL, NULL)#endifunsigned short historyISNs[1024];int historyISNLen = 0;/************************************************************************//* MACRO *//************************************************************************/#define IS_DIR(k) ((k) == C_UP || (k) == C_DOWN || (k) == C_LEFT || (k) == C_RIGHT)#define DIR_CHR 224#define C_UP -72#define C_DOWN -80#define C_LEFT -75#define C_RIGHT -77#define F_CHR 0#ifdef WIN32#define C_F1 -59#define C_F10 -68#define GET_SEL_INDEX(c) (C_F1 - (c)) #define IS_F(k) ((k) >= C_F10 && (k) <= C_F1)#else#define C_F1 'A'#define C_F10 ('A' + 9)#define GET_SEL_INDEX(c) ((c) - C_F1) #define IS_F(k) ((k) >= C_F1 && (k) <= C_F10)#define VK_UP 'I'#define VK_DOWN 'K'#define VK_LEFT 'J'#define VK_RIGHT 'L'#endif#define INDEX_TO_NUM(index) (0x30 + ((index) + 1) % 10)#define ARRAY_DIM(array) (sizeof((array)) / sizeof((array)[0]))/************************************************************************//* Constant *//************************************************************************/#define CHN_UDBDATA_LEN 1024*5 //中文自造詞數組大小(bytes),至少5K#define EN_UDBDATA_LEN 1024*2 //英文自造詞數組大小(bytes),至少2K#define FONT_WIDTH 12 //假定手機使用的字體為12 * 12#define PREEDIT_WIDTH 120 //假定編輯欄寬度為120(實際用來繪制音節、部首的像素寬度)/************************************************************************//* Data *//************************************************************************/extern const unsigned long prv_dataArray[] ; //中文數據extern const unsigned long prv_enDataArray[] ; //英文數據unsigned long gbChnSMData[CHN_UDBDATA_LEN / sizeof(unsigned long)]; // 中文自造詞數組unsigned long gbEnSMData[EN_UDBDATA_LEN / sizeof(unsigned long)]; // 英文自造詞數組/************************************************************************//* Func Declaration *//************************************************************************//* 函數功能: 中英文引擎初始化 */enum GBMMIReturn GBIMInit(GBEvent * pEvent);enum GBMMIReturn GBDrawPreEdit();void GBDrawCandidates();int mygetch();enum GBKey inputToGBKey(int input);int SelectIM();long GBGetStringWidth(const char * str_text);long GBGetWStringWidth(const unsigned short * str_text);void GBCombineString();void GBAddChar(GBUINT16 * str,GBUINT16 len);void ShowScreen();int UpToScreenW(const unsigned short * isns, size_t len);int UpToScreenA(const GBCHAR * str, size_t len);void ShowInputMethodInfo(enum __GBMMIInputMode inputMode);void GBDrawCandPageArrow();void ShowInput();void GBLoadSHData();void GBSaveSHData();#ifdef __linux__// 把UTF-8轉換成Unicodevoid UTF_8ToUnicode(unsigned short* pOut,char *pText){ char* uchar = (char *)pOut; uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F); uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F); return;}#define ARY_CLEAN(ary) memset(ary,0,sizeof(ary));#define unicodeStr2utf8(uStr,utf8Str,uStrLth) \do{ \ unsigned short temp[2]; \ unsigned short *pt =uStr; \ unsigned short temputf8[10]; \ \ ARY_CLEAN(utf8Str); \ while(*pt && (pt -uStr <uStrLth)) \ { \ temp[0] =*pt++; \ temp[1] =0; \ ARY_CLEAN(temputf8); \ UnicodeToUTF_8(temputf8,temp); \ strcat(utf8Str,temputf8); \ } \}while(0);#define U2C(u,c) \do{ \ARY_CLEAN(putf_8);\unsigned short *pu =u; \unsigned char *pc =c; \while(*pu) *pc++ =*pu++; \}while(0);//void unicodeStr2utf8(unsigned short *uStr,char *utf8Str,int uStrLth)//{// unsigned short temp[2];// unsigned short *pt =uStr;// unsigned short temputf8[10];//// ARY_CLEAN(utf8Str);// while(*pt && (pt -uStr <uStrLth))// {// temp[0] =*pt++;// temp[1] =0;// ARY_CLEAN(temputf8);// UnicodeToUTF_8(temputf8,temp);////printf("-----------------------------%s\n",temputf8);// strcat(utf8Str,temputf8);// }//}// Unicode 轉換成UTF-8 int UnicodeToUTF_8(char* pOut,unsigned short* pText){ // 注意 WCHAR高低字的順序,低字節在前,高字節在后 char* pchar = (char *)pText; unsigned short u =pText[0];// if((*pchar <= 'z' && *pchar >='a')|| (*pchar <= 'Z' && *pchar >='A'))// {// *pOut = *pchar;// return 1;// }//0000 - 007F 0xxxxxxx//0080 - 07FF 110xxxxx 10xxxxxx//0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx//printf("******************0x%x\n",u);//printf("------------------0x%x\n",pText[0]); if(pText[0] >= 0x0000 && pText[0] <= 0x007F) { pOut[0] = (char)pText[0];//printf("return 1"); return 1; } if(pText[0] >= 0x0080 && pText[0] <= 0x07FF) { pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);//printf("return 2"); return 2; } if(pText[0] >= 0x0800 && pText[0] <= 0xFFFF) { pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6); pOut[2] = (0x80 | (pchar[0] & 0x3F));//printf("return 3"); } return 3;}//int getch() //{// struct termios oldt,newt;// int ch;// tcgetattr( STDIN_FILENO, &oldt );// newt = oldt;// newt.c_lflag &= ~( ICANON | ECHO );// tcsetattr( STDIN_FILENO, TCSANOW, &newt );// ch = getchar();// tcsetattr( STDIN_FILENO, TCSANOW, &oldt );// return ch;//}int getch(){ char ch; struct termios save, ne; ioctl(0, TCGETS, &save); ioctl(0, TCGETS, &ne); ne.c_lflag &= ~(ECHO | ICANON); ioctl(0, TCSETS, &ne); read(0, &ch, 1); ioctl(0, TCSETS, &save); return ch;}#endifint main(int argc, char ** argv){ enum GBMMIReturn ret = GBMR_OK; GBEvent event; event.nType = GBET_In_Init;// event.param1 = GBIM_Chn_Pinyin; event.param1 = GBIM_Korean; event.param2 = GBL_Chinese; GBIMInit(&event);//開機的時候,引擎初始化一次 system("clear"); while(SelectIM()) { //ShowInputMethodInfo((enum __GBMMIInputMode)g_gbMMIGlobals.outputInfo.nInputMode); //ShowInput(); system("clear"); do { int input; enum GBKey key; /* { //電話薄反查碼表,適用于拼音,筆劃或者組合輸入模式中, //通過漢字的內碼,返回此漢字的拼音,筆劃或是組合的按鍵序列字符串 char buffer[32];//buffer的長度不小于32 event.nType = GBET_In_ReSearch; event.param1 = 0x4e00;//需要查詢的漢字內碼,0x4e00為"一"的unicode。 event.param2 = buffer;// GBHandleInputEvent(&event); } */ ShowInputMethodInfo((enum __GBMMIInputMode)g_gbMMIGlobals.outputInfo.nInputMode); input = mygetch(); system("clear"); key = inputToGBKey(input); if(key == GBKEY_NULL) { break; } event.nType = GBET_In_Key; event.param1 = key; event.param2 = GBKT_Down;//KeyType: Down ret = GBHandleInputEvent(&event);//按鍵處理 /* 在觸摸屏虛擬鍵盤模式下直接點擊某個候選上屏的調用方法如下: event.nType = GBET_In_SelCandidate; event.param1 = 2 ; ret = GBHandleInputEvent(&event);//按鍵處理 在觸摸屏虛擬鍵盤模式下直接點擊某個音節進行精確匹配候選的方法如下: event.nType = GBET_In_SetPinYinIndex; event.param1 = 1; ret = GBHandleInputEvent(&event);//按鍵處理 */ if(ret == GBMR_OK) { GBCombineString(); //上屏 if(g_gbMMIGlobals.outputInfo.isShowIMWin) { GBDrawPreEdit(); //在手機上畫編輯欄 GBDrawCandidates();//在手機上畫候選欄 GBDrawCandPageArrow();//畫候選翻頁指示箭頭 } //相應的刷新工作 } else if(ret == GBMR_Ignored) { if(key == GBKEY_Down) { //手機RichEdit區下移光標 } else if(key == GBKEY_Up) { //手機RichEdit區上移光標 } else if(key == GBKEY_Left) { //手機RichEdit區左移光標 } else if(key == GBKEY_Right) { //手機RichEdit區右移光標 } else if(key == GBKEY_OK) { //退到手機上級菜單 } else if(key == GBKEY_Back) { /* if(短按) { 刪除Edit一個字符 } else if(長按) { 刪除Edit所有的文本 } */ } //相應的手機刷新工作 } ShowInput(); }while(1); }#ifdef __GBSHDATA /*把自造詞數據寫入到文件,關機之前保存自造詞數據文件*/ GBSaveSHData();#endif return 0 ;}/************************************************************************//* Func Define *//************************************************************************/enum GBMMIReturn GBIMInit(GBEvent * pEvent){ unsigned short okToBeginMakeWordStr[]={'S','p','e','l','l','?',0}; unsigned short okToAddMakeWordStr[]={'A','d','d','?',0};//g_gbMMIGlobals.initData.sizGBMMIGlobals =sizeof(g_gbMMIGlobals);//g_gbMMIGlobals.initData.sizGBMMIGlobals =0; g_gbMMIGlobals.initData.chnInitData.pLDBData = prv_dataArray;//中文數據地址 g_gbMMIGlobals.initData.chnInitData.nCandDesireLenInWord = 7;//候選字數之和最大為8 g_gbMMIGlobals.initData.chnInitData.nInterpunctionDesireLen = 8;//一頁標點最多8個#if EBD_USE_DESIRE_COUNT > 0 g_gbMMIGlobals.initData.chnInitData.nCandDesireCount = 6;//候選個數最大為8#endif#ifdef __GBSHDATA g_gbMMIGlobals.initData.chnInitData.pUDBData = gbChnSMData;//中文自造詞數組 g_gbMMIGlobals.initData.chnInitData.nUDBDataLen = CHN_UDBDATA_LEN;//中文自造詞數組長度#else g_gbMMIGlobals.initData.chnInitData.pUDBData = 0; g_gbMMIGlobals.initData.chnInitData.nUDBDataLen = 0; #endif g_gbMMIGlobals.initData.latinInitData[0].nLanguageType = GBL_English;//多語言類型為英語 g_gbMMIGlobals.initData.latinInitData[0].pLDBData = prv_enDataArray;//英文數據#ifdef __GBSHDATA g_gbMMIGlobals.initData.latinInitData[0].pUDBData = gbEnSMData;//英文自造詞數組 g_gbMMIGlobals.initData.latinInitData[0].nUDBDataLen = EN_UDBDATA_LEN;//英文自造詞組大小,以byte為單位// gb_strcpy(g_gbMMIGlobals.initData.latinInitData[0].okToBeginMakeWordStr,L"Spell?");//自造詞提示信息Spell?// gb_strcpy(g_gbMMIGlobals.initData.latinInitData[0].okToAddMakeWordStr,L"Add?");////自造詞提示信息Add? gb_strcpy(g_gbMMIGlobals.initData.latinInitData[0].okToBeginMakeWordStr,okToBeginMakeWordStr);//自造詞提示信息Spell? gb_strcpy(g_gbMMIGlobals.initData.latinInitData[0].okToAddMakeWordStr,okToAddMakeWordStr);////自造詞提示信息Add?#else g_gbMMIGlobals.initData.latinInitData[0].pUDBData = 0; g_gbMMIGlobals.initData.latinInitData[0].nUDBDataLen = 0;#endif g_gbMMIGlobals.initData.latinInitData[0].nCandDesireCountInWord = 9;//最大英文候選個數 g_gbMMIGlobals.initData.latinInitData[0].nCandDesireLenInWord = 20;//一頁候選最多字符數,包括候選間的間隔 g_gbMMIGlobals.initData.bChnEnConvert = 1;//是否中英文切換 g_gbMMIGlobals.initData.bUpNumber =1;//是否數字上屏 g_gbMMIGlobals.initData.bUseLongPhress = 0;//是否長按 //不同平臺計算char字符串的寬度的函數是不同的,應該根據實際情況實現函數GBGetStringWidth g_gbMMIGlobals.uiInfo.fpGetStrWidth = GBGetStringWidth; //不同平臺計算wchar字符串的寬度的函數是不同的,應該根據實際情況實現函數GBGetWStringWidth g_gbMMIGlobals.uiInfo.fpGetWCharWidth= GBGetWStringWidth; g_gbMMIGlobals.uiInfo.nsyllableSplit = FONT_WIDTH / 2;//音節項之間的間隔(單位像素) g_gbMMIGlobals.uiInfo.npreEditWidth = 120;//模擬真實手機編輯欄的寬度(單位像素)#ifdef __GBSHDATA /*加載自造詞數據*/ GBLoadSHData();#endif return GBHandleInputEvent(pEvent);}#ifdef __linux__enum GBKey inputToGBKey(int input){ enum GBKey key = GBKEY_NULL; switch(input) { case '0': key = GBKEY_0; break; case '1': key = GBKEY_1; break; case '2': key = GBKEY_2; break; case '3': key = GBKEY_3; break; case '4': key = GBKEY_4; break; case '5': key = GBKEY_5; break; case '6': key = GBKEY_6; break; case '7': key = GBKEY_7; break; case '8': key = GBKEY_8; break; case '9': key = GBKEY_9; break; // case '*': // key = GBKEY_Star; // break; // case '#': // key = GBKEY_Sharp; // break; case 66: key = GBKEY_Down; break; case 65: key = GBKEY_Up; break; case 127: case 8: key = GBKEY_Back; break; case 68: key = GBKEY_Left; break; case 67: key = GBKEY_Right; break; case 32: key = GBKEY_OK; break; case 'i': key = GBKEY_TuchScreen_Up; break; case 'k': key = GBKEY_TuchScreen_Down; break; default: break; } return key;}#elseenum GBKey inputToGBKey(int input){ enum GBKey key = GBKEY_NULL; switch(input) { case VK_ESCAPE: key = GBKEY_NULL; break; case '0': key = GBKEY_0; break; case '1': key = GBKEY_1; break; case '2': key = GBKEY_2; break; case '3': key = GBKEY_3; break; case '4': key = GBKEY_4; break; case '5': key = GBKEY_5; break; case '6': key = GBKEY_6; break; case '7': key = GBKEY_7; break; case '8': key = GBKEY_8; break; case '9': key = GBKEY_9; break; case '*': key = GBKEY_Star; break; case '#': key = GBKEY_Sharp; break; case 'K': case C_DOWN: key = GBKEY_Down; break; case 'I': case C_UP: key = GBKEY_Up; break; case VK_BACK: key = GBKEY_Back; break; case 'J': case C_LEFT: key = GBKEY_Left; break; case 'L': case C_RIGHT: key = GBKEY_Right; break; case VK_RETURN: key = GBKEY_OK; break; default: key = input; break; } return key;}#endifenum GBMMIReturn GBDrawPreEdit(){ enum GBMMIReturn rs = GBMR_OK; int i,ret; //printf("編輯欄: \r\n"); char putf_8[256];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -