⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 english_chinese_test.c

📁 某中文手写输入法公司的手写识别输入的实例源程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -