1. 程式人生 > >Linux下音樂播放器的實現

Linux下音樂播放器的實現

1.專案描述:實現了播放器的頁面,並讀取出檔案中的歌曲名把歌曲列表顯示在右側。可以通過觸 摸螢幕上的按鈕實現暫停和繼續播放、靜音和解除靜音、調節音量大小、快進和快退、點選進度 條更改歌曲播放進度、點選歌曲名切換歌曲的功能。在歌詞隨歌曲的播放而同步顯示時,頁面中 還會展現歌曲名、演唱者、歌曲總長度、歌曲當前播放時間和歌曲進度百分比。 

2.專案流程:使用Glade實現了音樂播放器的頁面,然後建立無名管道讀取訊息和命名管道傳送命令。建立程序,子程序通過execlp函式啟動Mplayer,並重定向Mplayer的標準輸出到無名管道的寫端。在父程序中建立三個執行緒分別:向命名管道傳送命令,對Mplayer的播放控制;從無名管道讀取訊息,並將資訊顯示到介面;進行歌詞解析,實現歌詞同步顯示。

3.程式部分:

3.1背景顯示相關部分

sungtk_interface.h

#ifndef _SUNGTK_INTERFACE_H_
#define _SUNGTK_INTERFACE_H_

#include<gtk/gtk.h>


#define GET_WIDGET_WIDTH(widget)	widget->allocation.width	//widget寬度
#define GET_WIDGET_HEIGHT(widget)	widget->allocation.height	//widget高度

/*****************************************************
* 函式功能:設定背景圖
* 引數型別:	widget: 主視窗
* 				w, h:   圖片的大小
* 				path:  圖片路徑
* 返回值:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
******************************************************/
extern int sungtk_background_set_picture(GtkWidget *widget, const gchar *path, const int w, const int h);


/**************************************************
 * 函式功能:給建立好的image重新設計一張圖片
 * 引數型別:
 *				image:已建立好的image控制元件
 * 				file_path:圖片路徑
 *				 w、h:圖片長度和寬頻,如w==0&&h==0,則使用圖片預設大小
 * 返回型別:成功返回0,失敗返回-1
 * 維護記錄:2013-12-18 by lihuibo
 **************************************************/
extern int sungtk_image_load_picture(GtkWidget *image, const char *file_path, const int w, const int h );

/**************************************************
 * 函式功能:建立一個帶圖片的image控制元件
 * 引數型別:
 *				image:已建立好的image控制元件
 * 				file_path:圖片路徑
 *				 w、h:圖片長度和寬頻,如w==0&&h==0,則使用圖片預設大小
 * 返回型別:成功返回0,失敗返回-1
 * 維護記錄:2013-12-18 by lihuibo
 **************************************************/
GtkWidget *sungtk_image_new_from_file(const char *file_path, const int w, const int h);


/**************************************************
 * 函式功能:根據圖片路徑建立一個新按鈕,同時指定圖片大小
 * 引數型別:
 * 				file_path:圖片路徑
 * 				w、h:圖片長度和寬頻,如w==0&&h==0,則使用圖片預設大小
 * 返回型別:成功返回建立button地址
 * 維護記錄:2013-12-18 by lihuibo
 **************************************************/
extern GtkWidget *sungtk_button_new_with_image(const char *file_path, const int w, const int h);

/**************************************************
 * 函式功能:重新設定按鈕的照片
 * 引數型別:button:要設定的按鈕控制元件
 * 				file_path:圖片路徑
 * 				w、h:圖片長度和寬頻,如w==0&&h==0,則使用圖片預設大小
 * 返回型別:
 * 維護記錄:2013-12-18 by lihuibo
 **************************************************/
extern int sungtk_button_set_image(GtkWidget *button, const gchar *file_path, const int w, const int h);


//按鈕插入一張照片
extern GtkWidget *sungtk_button_inset_image(GtkWidget *button, const gchar *file_path, const int w, const int h);


//建立帶文字和圖片的按鈕
extern GtkWidget *sungtk_button_new_with_label_and_image(const char *file, const char *label, const int w, const int h);


/**************************************************
 * 函式功能: 設定控制元件字型大小
 * 引數型別:
 * 				widget: 需要改變字型的控制元件
 * 				size: 字型大小
 *				is_button: TRUE代表控制元件為按鈕,FALSE為其它控制元件
 * 返回型別:成功返回0,失敗返回-1
 * 維護記錄:2013-12-18 by lihuibo
 **************************************************/
extern int sungtk_widget_set_font_size(GtkWidget *widget, int size, gboolean is_button);

/***********************************************
* 函式功能:獲取一個GdkColor型別
* 引數型別:color_buf:設定字型顏色,如"red"、"blue"
				color:存放GdkColor型別地址
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
extern int sungtk_color_get(const char *color_buf, GdkColor *color);

/***********************************************
* 函式功能:設定控制元件字型顏色
* 引數型別:widget:需要改變顏色的控制元件
				color_buf:設定字型顏色,如"red"、"blue"
				is_button:是否為button
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
extern int sungtk_widget_set_font_color(GtkWidget *widget, const char *color_buf, gboolean is_button);

/***********************************************
* 函式功能:建立一個滾動視窗
* 引數型別:
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
extern GtkWidget *sungtk_scrolled_window_new(void);

/***********************************************
* 函式功能:設定滾動視窗的水平值
* 引數型別:widget:滾動視窗地址
				add_val:原基礎之上進行相加,正負值滾動相反方向
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
extern int sungtk_scrolled_window_set_hadjustment_value(GtkWidget *s_window, const gdouble add_val);

/***********************************************
* 函式功能:設定滾動視窗的垂直方向值
* 引數型別:widget:滾動視窗地址
				add_val:原基礎之上進行相加,正負值滾動相反方向
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
extern int sungtk_scrolled_window_set_vadjustment_value(GtkWidget *s_window, const gdouble add_val);



/************************自定義列表************************************/
//每一行點選時的回撥函式型別
typedef gboolean (*SunGtkSelectRow)(GtkWidget *widget, GdkEventButton *event, gpointer data);

//為列表建立的連結串列的結構體
typedef struct _clist_link
{
	GtkWidget *event_box;	//每一行都有一個事件盒子,用於支援點選
	GtkWidget *label;		//將label放置在事件盒子中,用於顯示文字
	struct _clist_link *next;
}CListLink;

//整個列表的結構體
typedef struct _sungtk_clist
{
	GtkWidget *fixed;		//整個列表是一個固定佈局
	GtkWidget *vbox;		//利用垂直佈局,可以動態追加行
	gint select_row;		//當前選中行
	gint font_size;			//字型大小
	gchar font_color[30];	//字型顏色
	gint row_height;		//每行的高度
	gint col_width;			//每行寬度
	gint total_num;			//行總數
	gchar sig_str[30];		//訊號
	SunGtkSelectRow callback;//行點選回撥函式
	CListLink *head;
}SunGtkCList;

#define SUNGTK_CLIST(x) (SunGtkCList *)x	

//自定義列表建立
extern SunGtkCList *sungtk_clist_new();

//列表釋放資源
extern int sungtk_clist_unref(SunGtkCList *clist);

//追加一行
extern int sungtk_clist_append(SunGtkCList *clist, const gchar *text);

//設定前景顏色
extern int sungtk_clist_set_foreground(SunGtkCList *clist, const gchar *color_buf);

//設定其中一行的顏色
extern int sungtk_clist_set_row_color(SunGtkCList *clist, gint row, const gchar *color_buf);

//選中某一行
extern int sungtk_clist_select_row(SunGtkCList *clist, gint row, const gchar *color_buf);

//設定行高度
extern int sungtk_clist_set_row_height(SunGtkCList *clist, gint height);

//設定列寬度
extern int sungtk_clist_set_col_width(SunGtkCList *clist, gint width);

//設定字型大小
extern int sungtk_clist_set_text_size(SunGtkCList *clist, int size);

//獲取某一行內容
extern const gchar *sungtk_clist_get_row_data(SunGtkCList *clist, gint row);

//設定某一行內容
extern int sungtk_clist_set_row_data(SunGtkCList *clist, gint row, const gchar *text);

//設定點選行的訊號
extern int sungtk_clist_set_select_row_signal(SunGtkCList *clist, const gchar *detailed_signal, SunGtkSelectRow callback);

//設定整個列表行在固定佈局的位置
extern void sungtk_clist_set_position_in_fixed(SunGtkCList *clist, gint x, gint y);

/**************************************************************************/




/*********************自定義滑動鎖***************************************/

#define MOTIONKEY_NUM 9	//鎖的個數

//滑動鎖擡起時回撥函式的的型別
typedef gboolean (*SunGtkMotionLockRelease)(GtkWidget *widget, GdkEventButton *event, gpointer data);

//整個滑動鎖的結構體
typedef struct _motion_lock
{
	GtkWidget *event_box;	//滑動事件盒子
	GtkWidget *fixed;		//事件盒子新增固定佈局
	GtkWidget *image[MOTIONKEY_NUM];	//圖片控制元件
	gint password[MOTIONKEY_NUM];		//密碼記錄
	gint pressed[MOTIONKEY_NUM];		//每個圖片是否以按下
	gint start_flag;		//第一次按下標誌位
	
	gint lock_size;			//整個滑動鎖的大小
	gint img_size;			//每張圖片大小
	gint space_size;		//圖片間的間距
	gchar *press_pic;		//按下照片路徑
	gchar *unpress_pic;		//未按下照片路徑
}SungtkMotionLock;

//滑動鎖擡起時的處理
extern void sungtk_motion_lock_release_deal(SungtkMotionLock *lock);

//設定滑動鎖擡起時執行的回撥函式, 實際就是事件盒子擡起事件
extern void sungtk_motion_lock_signal_release(SungtkMotionLock *lock, SunGtkMotionLockRelease callback_release);

//獲取滑動鎖按下的值
extern void sungtk_motion_lock_get_password(SungtkMotionLock *lock, char *pwd, int size);

//滑動鎖的建立,需要指定大小,和圖片路徑名
extern SungtkMotionLock *sungtk_motion_lock_new(gint lock_size, gint img_size, const gchar *press_pic, const gchar *unpress_pic);

//滑動鎖資源釋放
extern void sungtk_motion_lock_unref(SungtkMotionLock *lock);
/**************************************************************************/


#endif

sungtk_interface.c

#include<gtk/gtk.h>
#include<string.h>
#include<stdlib.h>
#include"sungtk_interface.h"

//函式功能:設定背景圖
int sungtk_background_set_picture(GtkWidget *widget, const gchar *path, const int w, const int h)
{
	if(widget==NULL || path==NULL)
		return -1;
	gtk_widget_set_app_paintable(widget, TRUE); 	//允許視窗可以繪圖
	gtk_widget_realize(widget); 
	
	/* 更改背景圖時,圖片會重疊
	 * 這時要手動呼叫下面的函式,讓視窗繪圖區域失效,產生視窗重繪製事件(即 expose 事件)。
	 */
	gtk_widget_queue_draw(widget);
	
	GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);	// 建立圖片資源物件
	// w, h是指定圖片的寬度和高度
	GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);

	GdkPixmap *pixmap = NULL;
	
	/* 建立pixmap影象; 
	 * NULL:不需要蒙版; 
	 * 123: 0~255,透明到不透明
	 */
	gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
	// 通過pixmap給widget設定一張背景圖,最後一個引數必須為: FASLE
	gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
	
	// 釋放資源
	g_object_unref(src_pixbuf);
	g_object_unref(dst_pixbuf);
	g_object_unref(pixmap);
	return 0;
}




 //函式功能:給建立好的image重新設計一張圖片

int sungtk_image_load_picture(GtkWidget *image, const char *file_path, const int w, const int h )
{
	GdkPixbuf *src_pixbuf = NULL;
	GdkPixbuf *dest_pixbuf = NULL;
	if(image==NULL || file_path==NULL)
		return -1;
	
	gtk_image_clear( GTK_IMAGE(image) );        // 清除影象
	src_pixbuf = gdk_pixbuf_new_from_file(file_path, NULL);	// 建立圖片資源
	if(w==0 && h==0){
		dest_pixbuf = src_pixbuf;
	}else{
		dest_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR); // 指定大小
	}
	gtk_image_set_from_pixbuf(GTK_IMAGE(image), dest_pixbuf); // 圖片控制元件重新設定一張圖片(pixbuf)

	if(w!=0 || h!=0)
		g_object_unref(dest_pixbuf);	// 釋放資源
		
	g_object_unref(src_pixbuf);		// 釋放資源
	return 0;
}


//函式功能:建立一個帶圖片的image控制元件

GtkWidget *sungtk_image_new_from_file(const char *file_path, const int w, const int h)
{
	GtkWidget *image = gtk_image_new_from_pixbuf(NULL);	
	sungtk_image_load_picture(image, file_path, w, h);
	return image;
}



//函式功能:根據圖片路徑建立一個新按鈕,同時指定圖片大小

GtkWidget *sungtk_button_new_with_image(const char *file_path, const int w, const int h)
{
	GtkWidget *temp_image = gtk_image_new_from_pixbuf(NULL);
	sungtk_image_load_picture(temp_image, file_path, w, h);
	
	GtkWidget *button = gtk_button_new(); 					// 先建立空按鈕
	gtk_button_set_image(GTK_BUTTON(button), temp_image);	// 給按鈕設定圖示
	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);	// 按鈕背景色透明
	
	return button;
}

//函式功能:重新設定按鈕的照片
int sungtk_button_set_image(GtkWidget *button, const gchar *file_path, const int w, const int h)
{
	if(button==NULL || file_path==NULL)
		return -1;
	GtkWidget *image = gtk_button_get_image(GTK_BUTTON(button)); // 獲得按鈕上面的圖示
	sungtk_image_load_picture(image, file_path, w, h);
	return 0;
}

GtkWidget *sungtk_button_inset_image(GtkWidget *button, const gchar *file_path, const int w, const int h)
{
	GtkWidget *temp_image = gtk_image_new_from_pixbuf(NULL);
	sungtk_image_load_picture(temp_image, file_path, w, h);
	gtk_button_set_image(GTK_BUTTON(button), temp_image);	// 給按鈕設定圖示
	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);	// 按鈕背景色透明
	return temp_image;
}


GtkWidget *sungtk_button_new_with_label_and_image(const char *file, const char *label, const int w, const int h)
{
	GtkWidget *temp_image = gtk_image_new_from_pixbuf(NULL);
	sungtk_image_load_picture(temp_image, file, w, h);
	
	GtkWidget *button = gtk_button_new_with_label(label); 					// 先建立空按鈕
	gtk_button_set_image(GTK_BUTTON(button), temp_image);	// 給按鈕設定圖示
	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);	// 按鈕背景色透明
	gtk_button_set_image_position(GTK_BUTTON(button), GTK_POS_TOP);
	return button;
}




//函式功能: 設定控制元件字型大小

int sungtk_widget_set_font_size(GtkWidget *widget, int size, gboolean is_button)
{
	GtkWidget *labelChild;  
	PangoFontDescription *font;  
	gint fontSize = size;  
	if(widget == NULL)
		return -1;
  
	font = pango_font_description_from_string("Sans");          //"Sans"字型名   
	pango_font_description_set_size(font, fontSize*PANGO_SCALE);//設定字型大小   
	
	if(is_button){
		labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton裡的label  
	}else{
		labelChild = widget;
	}
	
	//設定label的字型,這樣這個GtkButton上面顯示的字型就變了
	gtk_widget_modify_font(GTK_WIDGET(labelChild), font);
	pango_font_description_free(font);

	return 0;
}

//函式功能:獲取一個GdkColor型別

int sungtk_color_get(const char *color_buf, GdkColor *color)
{
	gdk_color_parse(color_buf, color);
	return 0;
}


//函式功能:設定視窗顯示字型顏色
int sungtk_widget_set_font_color(GtkWidget *widget, const char *color_buf, gboolean is_button)
{
	if(widget == NULL && color_buf==NULL)
		return -1;
	
	GdkColor color;
	GtkWidget *labelChild = NULL;
	sungtk_color_get(color_buf, &color);
	if(is_button == TRUE){
		labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton裡的label  
		gtk_widget_modify_fg(labelChild, GTK_STATE_NORMAL, &color);
		gtk_widget_modify_fg(labelChild, GTK_STATE_SELECTED, &color);
		gtk_widget_modify_fg(labelChild, GTK_STATE_PRELIGHT, &color);
	}else{
		gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color);
	}
	return 0;
}

//函式功能:建立一個滾動視窗

GtkWidget *sungtk_scrolled_window_new(void)
{
	GtkObject *adjust_h = NULL;
	GtkObject *adjust_v = NULL;

	adjust_h = gtk_adjustment_new(0, 0, 1, 1, 1, 1);
	adjust_v = gtk_adjustment_new(0, 0, 1, 1, 1, 1);
	GtkWidget *s_window = gtk_scrolled_window_new(GTK_ADJUSTMENT(adjust_h), GTK_ADJUSTMENT(adjust_v));
	return s_window;
}


//函式功能:設定滾動視窗的水平值

int sungtk_scrolled_window_set_hadjustment_value(GtkWidget *s_window, const gdouble add_val)
{
	GtkAdjustment *adjust_h = NULL;
	adjust_h = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(s_window));
	gdouble temp_val = gtk_adjustment_get_value(GTK_ADJUSTMENT(adjust_h));
	//printf("temp_val=====%lf\n", temp_val);
	gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust_h), temp_val+add_val);
	return 0;
}

/***********************************************
* 函式功能:設定滾動視窗的垂直方向值
* 引數型別:widget:滾動視窗地址
				add_val:原基礎之上進行相加,正負值滾動相反方向
* 返回型別:成功返回0,失敗返回-1
* 維護記錄:2013-12-18 by lihuibo
***********************************************/
int sungtk_scrolled_window_set_vadjustment_value(GtkWidget *s_window, const gdouble add_val)
{
	GtkAdjustment *adjust_v = NULL;
	adjust_v = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(s_window));
	gdouble temp_val = gtk_adjustment_get_value(GTK_ADJUSTMENT(adjust_v));
	//printf("temp_val=====%lf\n", temp_val);
	gtk_adjustment_set_value(GTK_ADJUSTMENT(adjust_v), temp_val+add_val);
	return 0;
}






/*********************自定義列表實現*************************************************/


static void sungtk_clist_set_label_color(GtkWidget *label, const char *color_buf)
{
	GdkColor color;
	gdk_color_parse(color_buf, &color);
	gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &color);
}

static void sungtk_clist_set_label_size(GtkWidget *label, const gint size)
{
	PangoFontDescription *font;  
	font = pango_font_description_from_string("Sans");          //"Sans"字型名   
	pango_font_description_set_size(font, size*PANGO_SCALE);//設定字型大小   
	gtk_widget_modify_font(GTK_WIDGET(label), font);
	pango_font_description_free(font);
}

int sungtk_clist_set_foreground(SunGtkCList *clist, const gchar *color_buf)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	memset(clist->font_color, 0, sizeof(clist->font_color));
	strncpy(clist->font_color, color_buf, sizeof(clist->font_color));
	while(temp_head)
	{
		sungtk_clist_set_label_color(temp_head->label, color_buf);
		temp_head = temp_head->next;
		++i;
	}
	return i;
}

int sungtk_clist_set_row_color(SunGtkCList *clist, gint row, const gchar *color_buf)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	while(temp_head)
	{
		if(i==row){
			sungtk_clist_set_label_color(temp_head->label, color_buf);
			break;
		}
		temp_head = temp_head->next;
		++i;
	}
	return i;
}


int sungtk_clist_select_row(SunGtkCList *clist, gint row, const gchar *color_buf)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	while(temp_head)
	{
		sungtk_clist_set_label_color(temp_head->label, clist->font_color);
		if(i==row){
			clist->select_row = i;
			sungtk_clist_set_label_color(temp_head->label, color_buf);
		}
		temp_head = temp_head->next;
		++i;
	}
	return i;
}

int sungtk_clist_set_row_height(SunGtkCList *clist, gint height)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	clist->row_height = height;
	while(temp_head)
	{
		gtk_widget_set_size_request(temp_head->event_box, clist->col_width, clist->row_height);
		temp_head = temp_head->next;
		++i;
	}
	return i;
}

int sungtk_clist_set_col_width(SunGtkCList *clist, gint width)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	clist->col_width = width;
	while(temp_head)
	{
		gtk_widget_set_size_request(temp_head->event_box, clist->col_width, clist->row_height);
		temp_head = temp_head->next;
		++i;
	}
	return i;
}

int sungtk_clist_set_text_size(SunGtkCList *clist, int size)
{
	if(clist == NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	clist->font_size = size;
	while(temp_head)
	{
		sungtk_clist_set_label_size(temp_head->label, size);
		temp_head = temp_head->next;
		++i;
	}
	return i;
}

const gchar *sungtk_clist_get_row_data(SunGtkCList *clist, gint row)
{
	if(clist == NULL)
		return NULL;
	int i = 0;
	CListLink *temp_head = clist->head;
	while(temp_head)
	{
		if(row == i)
			return gtk_label_get_text(GTK_LABEL(temp_head->label));
		temp_head = temp_head->next;
		++i;
	}
	return NULL;
}

int sungtk_clist_set_row_data(SunGtkCList *clist, gint row, const gchar *text)
{
	if(clist == NULL || text==NULL)
		return -1;
	int i = 0;
	CListLink *temp_head = clist->head;
	while(temp_head)
	{
		if(row == i){
			gtk_label_set_text(GTK_LABEL(temp_head->label), text);
			break;
		}
		temp_head = temp_head->next;
		++i;
	}
	return -1;
}


int sungtk_clist_set_select_row_signal(SunGtkCList *clist, const gchar *detailed_signal, SunGtkSelectRow callback)
{
	if(clist == NULL)
		return -1;

	clist->callback = callback;
	strncpy(clist->sig_str, detailed_signal, sizeof(clist->sig_str));
	return 0;
}

void sungtk_clist_set_position_in_fixed(SunGtkCList *clist, gint x, gint y)
{
	gtk_fixed_move(GTK_FIXED(clist->fixed), clist->vbox, x, y);
}


int sungtk_clist_append(SunGtkCList *clist, const gchar *text)
{
	if(clist==NULL || text==NULL)
		return -1;
	CListLink *temp = (CListLink *)malloc(sizeof(CListLink));
	if(temp==NULL)
		return -1;

	temp->event_box = gtk_event_box_new();
	gtk_event_box_set_visible_window(GTK_EVENT_BOX(temp->event_box), FALSE);
	gtk_widget_set_size_request(temp->event_box, clist->col_width, clist->row_height);
	gtk_container_add(GTK_CONTAINER(clist->vbox), temp->event_box);
	
	
	temp->label = gtk_label_new(text);
	gtk_misc_set_alignment(GTK_MISC(temp->label), 0, 0.5);//居中
	sungtk_clist_set_label_size(temp->label, clist->font_size);
	sungtk_clist_set_label_color(temp->label, clist->font_color);
	gtk_container_add(GTK_CONTAINER(temp->event_box), temp->label);
	temp->next = NULL;

	if(clist->callback != NULL){
		g_signal_connect(temp->event_box, clist->sig_str, G_CALLBACK(clist->callback), (void *)clist->total_num);
	}
	clist->total_num++;
	
	if(clist->head == NULL){
		clist->head = temp;
		return 0;
	}
	CListLink *temp_head = clist->head;
	CListLink *pf = NULL;
	while(temp_head)
	{
		pf = temp_head;
		temp_head = temp_head->next;
	}
	pf->next = temp;

	
	return 0;
}


SunGtkCList *sungtk_clist_new()
{
	SunGtkCList *clist = (SunGtkCList *)malloc(sizeof(SunGtkCList));
	if(clist==NULL)
		return NULL;
	memset(clist, 0, sizeof(SunGtkCList));
	clist->fixed = gtk_fixed_new();
	clist->vbox = gtk_vbox_new(TRUE, 0);
	gtk_fixed_put(GTK_FIXED(clist->fixed), clist->vbox, 0, 0);

	clist->font_size = 8;
	strncpy(clist->font_color, "black", sizeof(clist->font_color));
	clist->row_height = 30;
	clist->col_width = 100;
	clist->select_row = 0;
	clist->total_num = 0;
	return clist;
}

int sungtk_clist_unref(SunGtkCList *clist)
{
	if(clist == NULL)
		return-1;
	int i = 0;
	CListLink *temp_head = clist->head;
	CListLink *pf = NULL;
	while(temp_head)
	{
		pf = temp_head;
		temp_head = temp_head->next;
		gtk_widget_destroy(pf->label);
		gtk_widget_destroy(pf->event_box);
		free(pf);
		++i;
	}
	gtk_widget_destroy(clist->fixed);
	free(clist);
	return 0;
}
/**********************************************************************/




/********************自定義滑動鎖****************************/

static inline int get_press_image_num(SungtkMotionLock *lock, double press_x, double press_y)
{
	int i, j;
	int n = 0;
	int temp = lock->space_size + lock->img_size;
	//printf("press_x==%lf, press_y==%lf\n", press_x, press_y);
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if((press_x > lock->space_size+j*temp) && 
				(press_x < (j+1)*temp) &&
				(press_y > lock->space_size+i*temp) && 
				(press_y < (i+1)*temp)){
				return n;
			}
			n++;
		}
	}
	return -1;
}

static inline void sungtk_motion_lock_show_button(SungtkMotionLock *lock, int num)
{
	char *image[2] = {NULL, NULL};
	image[1] = lock->press_pic;
	image[0] = lock->unpress_pic;
	sungtk_image_load_picture(lock->image[num], image[lock->pressed[num]], lock->img_size, lock->img_size);
}


static inline void sungtk_motion_lock_show_board(SungtkMotionLock *lock)
{
	int i;
	char *image[2] = {NULL, NULL};
	image[1] = lock->press_pic;
	image[0] = lock->unpress_pic;
	for(i=0;i<MOTIONKEY_NUM;i++){
		sungtk_image_load_picture(lock->image[i], image[lock->pressed[i]], lock->img_size, lock->img_size);
	}
}

static inline void sungtk_remember_password(SungtkMotionLock *lock, int num)
{
	int i;
	for(i=0;i<MOTIONKEY_NUM;i++){
		if(lock->password[i] == 0)
			break;
	}
	lock->password[i] = num+1;
}


void sungtk_motion_lock_get_password(SungtkMotionLock *lock, char *pwd, int size)
{
	int i;
	if(pwd == NULL)
		return;

	memset(pwd, 0, size);
	for(i=0;i<MOTIONKEY_NUM && i<size;i++){
		if(lock->password[i] != 0){
			pwd[i] = lock->password[i] + '0';
		}
	}
}

static inline gboolean callback_lock_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
	SungtkMotionLock *lock = (SungtkMotionLock *)data;
	int num = get_press_image_num(lock, event->x, event->y);
	//printf("num===%d, ===%d\n", num, FALSE);
	memset(lock->password, 0, sizeof(lock->password));
	memset(lock->pressed, 0, sizeof(lock->pressed));
	if(num != -1){
		lock->start_flag = TRUE;
		lock->pressed[num] = TRUE;
		sungtk_motion_lock_show_button(lock, num);
		sungtk_remember_password(lock, num);
	}
	return TRUE;
}


static inline gboolean callback_lock_motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
	SungtkMotionLock *lock = (SungtkMotionLock *)data;
	if(lock->start_flag == FALSE)
		return FALSE;

	int num = get_press_image_num(lock, event->x, event->y);
	if(num != -1){
		if(lock->pressed[num] == FALSE){
			lock->pressed[num] = TRUE;
			sungtk_motion_lock_show_button(lock, num);
			sungtk_remember_password(lock, num);
		}
	}
	return TRUE;
}

static void sungtk_motion_lock_board_init(SungtkMotionLock *lock)
{
	int i,j;
	int n = 1;
	int temp = lock->space_size + lock->img_size;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			lock->image[n-1] = sungtk_image_new_from_file(lock->unpress_pic, lock->img_size, lock->img_size);
			gtk_fixed_put(GTK_FIXED(lock->fixed), lock->image[n-1], 
				lock->space_size+j*temp, lock->space_size+i*temp);
			n++;
		}
	}
} 

void sungtk_motion_lock_release_deal(SungtkMotionLock *lock)
{
	lock->start_flag = FALSE;
	memset(lock->pressed, 0, sizeof(lock->pressed));
	memset(lock->password, 0, sizeof(lock->password));
	sungtk_motion_lock_show_board(lock);
}

void sungtk_motion_lock_signal_release(SungtkMotionLock *lock, SunGtkMotionLockRelease callback_release)
{
	g_signal_connect(lock->event_box, "button-press-event", G_CALLBACK(callback_lock_press_event), lock);
	g_signal_connect(lock->event_box, "button-release-event", G_CALLBACK(callback_release), lock);
	g_signal_connect(lock->event_box, "motion-notify-event", G_CALLBACK(callback_lock_motion_event), lock);
} 

SungtkMotionLock *sungtk_motion_lock_new(gint lock_size, gint img_size, const gchar *press_pic, const gchar *unpress_pic)
{
	SungtkMotionLock *lock = (SungtkMotionLock *)malloc(sizeof(SungtkMotionLock));
	if(lock == NULL)
		return NULL;
	memset(lock, 0, sizeof(SungtkMotionLock));
	lock->lock_size = lock_size;
	lock->img_size = img_size;
	lock->space_size = (lock_size - 3*img_size)/4;
	
	lock->press_pic = (gchar *)malloc(strlen(press_pic)+1);
	memset(lock->press_pic, 0, strlen(press_pic)+1);
	strcpy(lock->press_pic, press_pic);

	lock->unpress_pic = (gchar *)malloc(strlen(unpress_pic)+1);
	memset(lock->unpress_pic, 0, strlen(unpress_pic)+1);
	strcpy(lock->unpress_pic, unpress_pic);

	lock->event_box = gtk_event_box_new();
	gtk_event_box_set_visible_window(GTK_EVENT_BOX(lock->event_box), FALSE);
	gtk_widget_set_size_request(lock->event_box, lock_size, lock_size);

	lock->fixed = gtk_fixed_new();
	gtk_container_add(GTK_CONTAINER(lock->event_box), lock->fixed);
	sungtk_motion_lock_board_init(lock);

	return lock;
}

void sungtk_motion_lock_unref(SungtkMotionLock *lock)
{
	int i;
	if(lock == NULL)
		return;
	for(i=0;i<MOTIONKEY_NUM;i++){
		gtk_widget_destroy(lock->image[i]);
	}
	gtk_widget_destroy(lock->fixed);
	gtk_widget_destroy(lock->event_box);
	free(lock->press_pic);
	free(lock->unpress_pic);
	free(lock);
}

3.2格式部分

gb2312_ucs2.h

#ifndef __GB2312_UCS2_H__
#define __GB2312_UCS2_H__
/*************************************************************
* 檔案:gb2312_ucs2.c gb2312_ucs2.h
* 功能:GB2312碼與uncode 碼相互轉換。
**************************************************************/

/*************************************************************
* 語法格式:unsigned short gb2312_to_ucs2(unsigned short ucs2)
* 實現功能:gb2312轉換為ucs2
* 引數:	gb2312 待轉換的gb2312編碼
* 返回值:	ucs2編碼
**************************************************************/
unsigned short gb2312_to_ucs2(unsigned short gb2312);

/*************************************************************
* 語法格式:unsigned short ucs2_to_gb2312(unsigned short ucs2)
* 實現功能:ucs2轉gb2312
* 引數:	ucs2: 待轉換的ucs2編碼
* 返回值:	gb2312編碼
**************************************************************/
unsigned short ucs2_to_gb2312(unsigned short ucs2);

/*************************************************************
*功能:
* 說明:
* UTF-8以位元組為單位對Unicode進行編碼。
* 從Unicode到UTF-8的編碼方式如下:
* Unicode編碼(16進位制) --> UTF-8 位元組流(二進位制) 
* U-00000000 ~ U-0000007F --> 0xxxxxxx  
* U-00000080 ~ U-000007FF --> 110xxxxx 10xxxxxx  
* U-00000800 ~ U-0000FFFF --> 1110xxxx 10xxxxxx 10xxxxxx  
* U-00010000 ~ U-001FFFFF --> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
* U-00200000 ~ U-03FFFFFF --> 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
* U-04000000 ~ U-7FFFFFFF --> 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
* 故根據每個漢字的第一個位元組,便可以知道utf-8漢字由幾個位元組組成
*************************************************************/
int get_utf8_nbytes(unsigned char first_char);

/*************************************************************
* 語法格式:int utf8_to_ucs2(const char *utf8)
* 實現功能:utf-8字串轉換為unicode碼
* 引數:	utf utf-8字串
* 返回值:	unicode碼碼值
*************************************************************/
int utf8_to_ucs2(const char *utf8);

/*************************************************************
* 語法格式:char *utf8str_to_ucs2str(char *dest, char *source)
* 功能:	utf8字串轉為ucs2字串
* 引數:	source:utf8字串
			dest:ucs2字串
* 返回值:	ucs2字串首地址
**************************************************************/
char *utf8str_to_ucs2str(char *dest, char *source);

/*************************************************************
* 語法格式:unsigned char *utf8_to_gb2312(
							const unsigned char *utf, unsigned char *gb2312)
* 實現功能:utf-8字串轉換為gb2312字串
* 引數:	utf utf-8字串
* 			gb2312 gb2312字串
* 返回值:	
**************************************************************/
unsigned char *utf8_to_gb2312(const unsigned char *utf, unsigned char *gb2312);

/*************************************************************
* 語法格式:unsigned char *gb2312_to_utf8(
							const unsigned char *gb2312, unsigned char *utf)
* 實現功能:gb2312字串轉換為utf-8字串
* 引數:	gb2312 gb2312字串
* 			utf utf-8字串
* 返回值:	
**************************************************************/
unsigned char *gb2312_to_utf8(const unsigned char *gb2312, unsigned char *utf);

#endif 

gb2312_ucs2.c

/*************************************************************
* 檔名稱:gb2312_ucs2.c
* 功能描述:	gb2312、ucs2間的轉換
* 位元組序:little-endian 低地址存低位元組
**************************************************************/
#include <stdio.h>
#include <string.h>
#define BIT(x) ((0x01)<<(x))
typedef unsigned char uchar;
const unsigned short MAX_UNI_INDEX = 6808; /*6768*/

/*************************************************************
*功能: 十六進位制基數碼錶
**************************************************************/
static const char radix_table[] = "0123456789ABCDEF";

/*************************************************************
*功能: ucs2_gb2312_table碼錶
**************************************************************/
static const unsigned short ucs2_gb2312_table[][2];

/*************************************************************
* 語法格式:unsigned short gb2312_to_ucs2(unsigned short ucs2)
* 實現功能:gb2312轉換為ucs2
* 引數:	gb2312 待轉換的gb2312編碼
* 返回值:	ucs2編碼
**************************************************************/
unsigned short gb2312_to_ucs2(unsigned short gb2312)
{
	int Index;

	for(Index = MAX_UNI_INDEX - 1; Index >= 0; Index--)
	{
		if(gb2312 == ucs2_gb2312_table[Index][1])
			return ucs2_gb2312_table[Index][0];
	}
	return 0;
}

/*************************************************************
* 語法格式:unsigned short ucs2_to_gb2312(unsigned short ucs2)
* 實現功能:ucs2轉gb2312
* 引數:	ucs2: 待轉換的ucs2編碼
* 返回值:	gb2312編碼
**************************************************************/
unsigned short ucs2_to_gb2312(unsigned short ucs2)
{
	int left = 0;
	int right = MAX_UNI_INDEX - 1;
	int middle;

	while(left <= right)
	{
		middle = (left+right)/2;
		if (ucs2 == ucs2_gb2312_table[middle][0])
			return ucs2_gb2312_table[middle][1];
		if (ucs2 > ucs2_gb2312_table[middle][0])
			left = middle + 1;
		else
			right = middle - 1;
	}
	/*如果找不到漢字,則使用全形的空格代替*/
	return 0xFED7;
}

/*************************************************************
*功能:
* 說明:
* UTF-8以位元組為單位對Unicode進行編碼。
* 從Unicode到UTF-8的編碼方式如下:
* Unicode編碼(16進位制) --> UTF-8 位元組流(二進位制) 
* U-00000000 ~ U-0000007F --> 0xxxxxxx  
* U-00000080 ~ U-000007FF --> 110xxxxx 10xxxxxx  
* U-00000800 ~ U-0000FFFF --> 1110xxxx 10xxxxxx 10xxxxxx  
* U-00010000 ~ U-001FFFFF --> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
* U-00200000 ~ U-03FFFFFF --> 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
* U-04000000 ~ U-7FFFFFFF --> 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
* 故根據每個漢字的第一個位元組,便可以知道utf-8漢字由幾個位元組組成
*************************************************************/
int get_utf8_nbytes(unsigned char first_char)
{
	unsigned char temp = 0x080;
	int num = 0;
	
	if(first_char < 0x80)
	{
		num = 1;
	}
	while (temp & first_char)
	{
	    num++;
		//printf("in Get num=%d\n", num);
	    temp = (temp >> 1);
	}
	return num;
}

/*************************************************************
* 語法格式:int utf8_to_ucs2(const char *utf8)
* 實現功能:utf-8字串轉換為unicode碼
* 引數:	utf utf-8字串
* 返回值:	unicode碼碼值
*************************************************************/
int utf8_to_ucs2(const char *utf8)
{
	int bytes = 0;
	int unicode = 0;
	
	bytes = get_utf8_nbytes(utf8[0]);
	//printf("bytes = %d\n", bytes);
	if((bytes>0) && (bytes<=6))
	{
		switch(bytes)
		{
			case 1:
				unicode = (int)(utf8[0]&(0x7f));
				break;
			case 2:
				unicode = ((int)(utf8[0]&(0x1f)))<<6 
							| ((int)(utf8[1]&(0x3f)));
				break;
			case 3:
				unicode = ((int)(utf8[0]&(0x0f)))<<12 
							| ((int)(utf8[1]&(0x3f)))<<6
							| ((int)(utf8[2]&(0x3f)));
				break;
			case 4:
				unicode = ((int)(utf8[0]&(0x07)))<<18 
							| ((int)(utf8[1]&(0x3f)))<<12
							| ((int)(utf8[2]&(0x3f)))<<6
							| ((int)(utf8[3]&(0x3f)));
				break;
			case 5:
				unicode = ((int)(utf8[0]&(0x03)))<<24 
							| ((int)(utf8[1]&(0x3f)))<<18
							| ((int)(utf8[2]&(0x3f)))<<12
							| ((int)(utf8[3]&(0x3f)))<<6
							| ((int)(utf8[4]&(0x3f)));
				break;
			case 6:
				unicode = ((int)(utf8[0]&(0x01)))<<30 
							| ((int)(utf8[1]&(0x3f)))<<24
							| ((int)(utf8[2]&(0x3f)))<<18
							| ((int)(utf8[3]&(0x3f)))<<12
							| ((int)(utf8[4]&(0x3f)))<<6
							| ((int)(utf8[5]&(0x3f)));
				break;
			default:
				break;
		}
	}
	return unicode;
}

/*************************************************************
* 語法格式:char *utf8str_to_ucs2str(char *dest, char *source)
* 功能:	utf8字串轉為ucs2字串
* 引數:	source:utf8字串
			dest:ucs2字串
* 返回值:	ucs2字串首地址
**************************************************************/
char *utf8str_to_ucs2str(char *dest, char *source)
{
	char *tmp = NULL;
	int bytes;
	int ucs2;
	
	tmp = dest;
	while(1)
	{
		bytes = get_utf8_nbytes(source[0]);
		//printf("source = %s\n", source);
		ucs2 = utf8_to_ucs2(source);
		sprintf(tmp, "%04X", ucs2);
		tmp += 4;
		source += bytes;
		if(strlen(source) == 0)
			break;
	}
	//printf("dest = %s\n", dest);
	return dest;
}

/*************************************************************
* 語法格式:unsigned char *utf8_to_gb2312(
							const unsigned char *utf, unsigned char *gb2312)
* 實現功能:utf-8字串轉換為gb2312字串
* 引數:	utf utf-8字串
* 			gb2312 gb2312字串
* 返回值:	
**************************************************************/
unsigned char *utf8_to_gb2312(const unsigned char *utf, unsigned char *gb2312)
{
	int num=0;
	unsigned short unicodekey;
	unsigned short gb2312key;
	unsigned char *gb2312_base;
	
	gb2312_base = gb2312;
	while(*utf)
	{
		/*U-00000000 ~ U-0000007F --> 0xxxxxxx*/
		if(utf[0] <= 0x7F)
		{
			gb2312[0] = utf[0];
			// printf("gb2312[0] = %#x\n", gb2312[0]);
			// printf("utf[0] = %#x\n", utf[0]);
			utf++;
			gb2312++;
		}
		else
		{
			num = get_utf8_nbytes(utf[0]);
			// printf("num = %d\n", num);
			/*U-00000800 ~ U-0000FFFF --> 1110xxxx 10xxxxxx 10xxxxxx*/
			if(num==3)
			{
				unicodekey = (((unsigned short)(((utf[0]&0x0f)<<4)|((utf[1]&0x3c)>>2)))<<8)
							|(((utf[1]&0x03)<<6)|(utf[2]&0x3F));
				gb2312key = ucs2_to_gb2312(unicodekey);
				gb2312[0] = (unsigned char)(gb2312key&0x00ff);
				gb2312[1] = (unsigned char)((gb2312key&0xff00)>>8);
				// printf("utf[0] = %#x\n", utf[0]);
				// printf("utf[1] = %#x\n", utf[1]);
				// printf("utf[2] = %#x\n", utf[2]);
				// printf("unicodekey = %#x\n", unicodekey);
				// printf("gb2312key = %#x\n", gb2312key);	
				// printf("gb2312[0] = %#x\n", gb2312[0]);
				// printf("gb2312[1] = %#x\n", gb2312[1]);
				utf += num;
				gb2312 +=2;
			}
			else
			{
				printf("gb2312 code not found\n");
				return NULL;
			}
		}
	}
	return gb2312_base;
}

/*************************************************************
* 語法格式:unsigned char *gb2312_to_utf8(
							const unsigned char *gb2312, unsigned char *utf)
* 實現功能:gb2312字串轉換為utf-8字串
* 引數:	gb2312 gb2312字串
* 			utf utf-8字串
* 返回值:	
**************************************************************/
unsigned char *gb2312_to_utf8(const unsigned char *gb2312, unsigned char *utf)
{
	unsigned short unicodekey;
	unsigned short gb2312key;
	unsigned char *utf_base;
	
	utf_base = utf;
	while(*gb2312)
	{
		/* U-00000000 ~ U-0000007F --> 0xxxxxxx */
		if(gb2312[0] <= 0x7F)
		{
			utf[0] = gb2312[0];
			utf++;
			gb2312++;
			// printf("gb2312[0] = %#x\n", gb2312[0]);
			// printf("utf[0] = %#x\n", utf[0]);
		}
		else
		{
			/*U-00000800 ~ U-0000FFFF --> 1110xxxx 10xxxxxx 10xxxxxx*/
			gb2312key = ((unsigned short )gb2312[1])<<8
						|((unsigned short )(gb2312[0]));
			unicodekey = gb2312_to_ucs2(gb2312key);
			// printf("gb2312[0] = %#x\n", gb2312[0]);
			// printf("gb2312[1] = %#x\n", gb2312[1]);
			// printf("gb2312key = %#x\n", gb2312key);	
			// printf("unicodekey = %#x\n", unicodekey);
			/* U-00000800 ~ U-0000FFFF --> 1110xxxx 10xxxxxx 10xxxxxx */
			if(0x0800 <= unicodekey)
			{
				
				utf[0] = (unicodekey>>12)|0x0E0;
				utf[1] = ((unicodekey&0x0FC0)>>6)|0x080;
				utf[2] = (unicodekey&0x3F)|0x080;
				// printf("utf[0] = %#x\n", utf[0]);
				// printf("utf[1] = %#x\n", utf[1]);
				// printf("utf[2] = %#x\n", utf[2]);
				utf +=3;
				gb2312 += 2;
			}
			else
			{
				printf("gb2312 code not found\n");
				return NULL;
			}
		}
	}
	return utf_base;
}

/*************************************************************
*功能: ucs2_gb2312_table碼錶
**************************************************************/
static const unsigned short ucs2_gb2312_table[][2]={
	/*unicode,GB2312*/
    {0x4E00,0xBBD2}, /* 一: GB2312 Code: 0xD2BB ==> Row:50 Col:27 */
    {0x4E01,0xA1B6}, /* 丁: GB2312 Code: 0xB6A1 ==> Row:22 Col:01 */
    {0x4E03,0xDFC6}, /* 七: GB2312 Code: 0xC6DF ==> Row:38 Col:63 */
    {0x4E07,0xF2CD}, /* 萬: GB2312 Code: 0xCDF2 ==> Row:45 Col:82 */
    {0x4E08,0xC9D5}, /* 丈: GB2312 Code: 0xD5C9 ==> Row:53 Col:41 */
    {0x4E09,0xFDC8}, /* 三: GB2312 Code: 0xC8FD ==> Row:40 Col:93 */
    {0x4E0A,0xCFC9}, /* 上: GB2312 Code: 0xC9CF ==> Row:41 Col:47 */
    {0x4E0B,0xC2CF}, /* 下: GB2312 Code: 0xCFC2 ==> Row:47 Col:34 */
    {0x4E0C,0xA2D8}, /* 丌: GB2312 Code: 0xD8A2 ==> Row:56 Col:02 */
    {0x4E0D,0xBBB2}, /* 不: GB2312 Code: 0xB2BB ==> Row:18 Col:27 */
    {0x4E0E,0xEBD3}, /* 與: GB2312 Code: 0xD3EB ==> Row:51 Col:75 */
    {0x4E10,0xA4D8}, /* 丐: GB2312 Code: 0xD8A4 ==> Row:56 Col:04 */
    {0x4E11,0xF3B3}, /* 醜: GB2312 Code: 0xB3F3 ==> Row:19 Col:83 */
    {0x4E13,0xA8D7}, /* 專: GB2312 Code: 0xD7A8 ==> Row:55 Col:08 */
    {0x4E14,0xD2C7}, /* 且: GB2312 Code: 0xC7D2 ==> Row:39 Col:50 */
    {0x4E15,0xA7D8}, /* 丕: GB2312 Code: 0xD8A7 ==> Row:56 Col:07 */
    {0x4E16,0xC0CA}, /* 世: GB2312 Code: 0xCAC0 ==> Row:42 Col:32 */
    {0x4E18,0xF0C7}, /* 丘: GB2312 Code: 0xC7F0 ==> Row:39 Col:80 */
    {0x4E19,0xFBB1}, /* 丙: GB2312 Code: 0xB1FB ==> Row:17 Col:91 */
    {0x4E1A,0xB5D2}, /* 業: GB2312 Code: 0xD2B5 ==> Row:50 Col:21 */
    {0x4E1B,0xD4B4}, /* 叢: GB2312 Code: 0xB4D4 ==> Row:20 Col:52 */
    {0x4E1C,0xABB6}, /* 東: GB2312 Code: 0xB6AB ==> Row:22 Col:11 */
    {0x4E1D,0xBFCB}, /* 絲: GB2312 Code: 0xCBBF ==> Row:43 Col:31 */
    {0x4E1E,0xA9D8}, /* 丞: GB2312 Code: 0xD8A9 ==> Row:56 Col:09 */
    {0x4E22,0xAAB6}, /* 丟: GB2312 Code: 0xB6AA ==> Row:22 Col:10 */
    {0x4E24,0xBDC1}, /* 兩: GB2312 Code: 0xC1BD ==> Row:33 Col:29 */
    {0x4E25,0xCFD1}, /* 嚴: GB2312 Code: 0xD1CF ==> Row:49 Col:47 */
    {0x4E27,0xA5C9}, /* 喪: GB2312 Code: 0xC9A5 ==> Row:41 Col:05 */
    {0x4E28,0xADD8}, /* 丨: GB2312 Code: 0xD8AD ==> Row:56 Col:13 */
    {0x4E2A,0xF6B8}, /* 個: GB2312 Code: 0xB8F6 ==> Row:24 Col:86 */
    {0x4E2B,0xBED1}, /* 丫: GB2312 Code: 0xD1BE ==> Row:49 Col:30 */
    {0x4E2C,0xDCE3}, /* 丬: GB2312 Code: 0xE3DC ==> Row:67 Col:60 */
    {0x4E2D,0xD0D6}, /* 中: GB2312 Code: 0xD6D0 ==> Row:54 Col:48 */
    {0x4E30,0xE1B7}, /* 豐: GB2312 Code: 0xB7E1 ==> Row:23 Col:65 */
    {0x4E32,0xAEB4}, /* 串: GB2312 Code: 0xB4AE ==> Row:20 Col:14 */
    {0x4E34,0xD9C1}, /* 臨: GB2312 Code: 0xC1D9 ==> Row:33 Col:57 */
    {0x4E36,0xBCD8}, /* 丶: GB2312 Code: 0xD8BC ==> Row:56 Col:28 */
    {0x4E38,0xE8CD}, /* 丸: GB2312 Code: 0xCDE8 ==> Row:45 Col:72 */
    {0x4E39,0xA4B5}, /* 丹: GB2312 Code: 0xB5A4 ==> Row:21 Col:04 */
    {0x4E3A,0xAACE}, /* 為: GB2312 Code: 0xCEAA ==> Row:46 Col:10 */
    {0x4E3B,0xF7D6}, /* 主: GB2312 Code: 0xD6F7 ==> Row:54 Col:87 */
    {0x4E3D,0xF6C0}, /* 麗: GB2312 Code: 0xC0F6 ==> Row:32 Col:86 */
    {0x4E3E,0xD9BE}, /* 舉: GB2312 Code: 0xBED9 ==> Row:30 Col:57 */
    {0x4E3F,0xAFD8}, /* 丿: GB2312 Code: 0xD8AF ==> Row:56 Col:15 */
    {0x4E43,0xCBC4}, /* 乃: GB2312 Code: 0xC4CB ==> Row:36 Col:43 */
    {0x4E45,0xC3BE}, /* 久: GB2312 Code: 0xBEC3 ==> Row:30 Col:35 */
    {0x4E47,0xB1D8}, /* 乇: GB2312 Code: 0xD8B1 ==> Row:56 Col:17 */
    {0x4E48,0xB4C3}, /* 麼: GB2312 Code: 0xC3B4 ==> Row:35 Col:20 */
    {0x4E49,0xE5D2}, /* 義: GB2312 Code: 0xD2E5 ==> Row:50 Col:69 */
    {0x4E4B,0xAED6}, /* 之: GB2312 Code: 0xD6AE ==> Row:54 Col:14 */
    {0x4E4C,0xDACE}, /* 烏: GB2312 Code: 0xCEDA ==> Row:46 Col:58 */
    {0x4E4D,0xA7D5}, /* 乍: GB2312 Code: 0xD5A7 ==> Row:53 Col:07 */
    {0x4E4E,0xF5BA}, /* 乎: GB2312 Code: 0xBAF5 ==> Row:26 Col:85 */
    {0x4E4F,0xA6B7}, /* 乏: GB2312 Code: 0xB7A6 ==> Row:23 Col:06 */
    {0x4E50,0xD6C0}, /* 樂: GB2312 Code: 0xC0D6 ==> Row:32 Col:54 */
    {0x4E52,0xB9C6}, /* 乒: GB2312 Code: 0xC6B9 ==> Row:38 Col:25 */
    {0x4E53,0xD2C5}, /* 乓: GB2312 Code: 0xC5D2 ==> Row:37 Col:50 */
    {0x4E54,0xC7C7}, /* 喬: GB2312 Code: 0xC7C7 ==> Row:39 Col:39 */
    {0x4E56,0xD4B9}, /* 乖: GB2312 Code: 0xB9D4 ==> Row:25 Col:52 */
    {0x4E58,0xCBB3}, /* 乘: GB2312 Code: 0xB3CB ==> Row:19 Col:43 */
    {0x4E59,0xD2D2}, /* 乙: GB2312 Code: 0xD2D2 ==> Row:50 Col:50 */
    {0x4E5C,0xBFD8}, /* 乜: GB2312 Code: 0xD8BF ==> Row:56 Col:31 */
    {0x4E5D,0xC5BE}, /* 九: GB2312 Code: 0xBEC5 ==> Row:30 Col:37 */
    {0x4E5E,0xF2C6}, /* 乞: GB2312 Code: 0xC6F2 ==> Row:38 Col:82 */
    {0x4E5F,0xB2D2}, /* 也: GB2312 Code: 0xD2B2 ==> Row:50 Col:18 */
    {0x4E60,0xB0CF}, /* 習: GB2312 Code: 0xCFB0 ==> Row:47 Col:16 */
    {0x4E61,0xE7CF}, /* 鄉: GB2312 Code: 0xCFE7 ==> Row:47 Col:71 */
    {0x4E66,0xE9CA}, /* 書: GB2312 Code: 0xCAE9 ==> Row:42 Col:73 */
    {0x4E69,0xC0D8}, /* 乩: GB2312 Code: 0xD8C0 ==> Row:56 Col:32 */
    {0x4E70,0xF2C2}, /* 買: GB2312 Code: 0xC2F2 ==> Row:34 Col:82 */
    {0x4E71,0xD2C2}, /* 亂: GB2312 Code: 0xC2D2 ==> Row:34 Col:50 */
    {0x4E73,0xE9C8}, /* 乳: GB2312 Code: 0xC8E9 ==> Row:40 Col:73 */
    {0x4E7E,0xACC7}, /* 乾: GB2312 Code: 0xC7AC ==> Row:39 Col:12 */
    {0x4E86,0xCBC1}, /* 了: GB2312 Code: 0xC1CB ==> Row:33 Col:43 */
    {0x4E88,0xE8D3}, /* 予: GB2312 Code: 0xD3E8 ==> Row:51 Col:72 */
    {0x4E89,0xF9D5}, /* 爭: GB2312 Code: 0xD5F9 ==> Row:53 Col:89 */
    {0x4E8B,0xC2CA}, /* 事: GB2312 Code: 0xCAC2 ==> Row:42 Col:34 */
    {0x4E8C,0xFEB6}, /* 二: GB2312 Code: 0xB6FE ==> Row:22 Col:94 */
    {0x4E8D,0xA1D8}, /* 亍: GB2312 Code: 0xD8A1 ==> Row:56 Col:01 */
    {0x4E8E,0xDAD3}, /* 於: GB2312 Code: 0xD3DA ==> Row:51 Col:58 */
    {0x4E8F,0xF7BF}, /* 虧: GB2312 Code: 0xBFF7 ==> Row:31 Col:87 */
    {0x4E91,0xC6D4}, /* 雲: GB2312 Code: 0xD4C6 ==> Row:52 Col:38 */
    {0x4E92,0xA5BB}, /* 互: GB2312 Code: 0xBBA5 ==> Row:27 Col:05 */
    {0x4E93,0xC1D8}, /* 亓: GB2312 Code: 0xD8C1 ==> Row:56 Col:33 */
    {0x4E94,0xE5CE}, /* 五: GB2312 Code: 0xCEE5 ==> Row:46 Col:69 */
    {0x4E95,0xAEBE}, /* 井: GB2312 Code: 0xBEAE ==> Row:30 Col:14 */
    {0x4E98,0xA8D8}, /* 亙: GB2312 Code: 0xD8A8 ==> Row:56 Col:08 */
    {0x4E9A,0xC7D1}, /* 亞: GB2312 Code: 0xD1C7 ==> Row:49 Col:39 */
    {0x4E9B,0xA9D0}, /* 些: GB2312 Code: 0xD0A9 ==> Row:48 Col:09 */
    {0x4E9F,0xBDD8}, /* 亟: GB2312 Code: 0xD8BD ==> Row:56 Col:29 */
    {0x4EA0,0xEFD9}, /* 亠: GB2312 Code: 0xD9EF ==> Row:57 Col:79 */
    {0x4EA1,0xF6CD}, /* 亡: GB2312 Code: 0xCDF6 ==> Row:45 Col:86 */
    {0x4EA2,0xBABF}, /* 亢: GB2312 Code: 0xBFBA ==> Row:31 Col:26 */
    {0x4EA4,0xBBBD}, /* 交: GB2312 Code: 0xBDBB ==> Row:29 Col:27 */
    {0x4EA5,0xA5BA}, /* 亥: GB2312 Code: 0xBAA5 ==> Row:26 Col:05 */
    {0x4EA6,0xE0D2}, /* 亦: GB2312 Code: 0xD2E0 ==> Row:50 Col:64 */
    {0x4EA7,0xFAB2}, /* 產: GB2312 Code: 0xB2FA ==> Row:18 Col:90 */
    {0x4EA8,0xE0BA}, /* 亨: GB2312 Code: 0xBAE0 ==> Row:26 Col:64 */
    {0x4EA9,0xB6C4}, /* 畝: GB2312 Code: 0xC4B6 ==> Row:36 Col:22 */
    {0x4EAB,0xEDCF}, /* 享: GB2312 Code: 0xCFED ==> Row:47 Col:77 */
    {0x4EAC,0xA9BE}, /* 京: GB2312 Code: 0xBEA9 ==> Row:30 Col:09 */
    {0x4EAD,0xA4CD}, /* 亭: GB2312 Code: 0xCDA4 ==> Row:45 Col:04 */
    {0x4EAE,0xC1C1}, /* 亮: GB2312 Code: 0xC1C1 ==> Row:33 Col:33 */
    {0x4EB2,0xD7C7}, /* 親: GB2312 Code: 0xC7D7 ==> Row:39 Col:55 */
    {0x4EB3,0xF1D9}, /* 亳: GB2312 Code: 0xD9F1 ==> Row:57 Col:81 */
    {0x4EB5,0xF4D9}, /* 褻: GB2312 Code: 0xD9F4 ==> Row:57 Col:84 */
    {0x4EBA,0xCBC8}, /* 人: GB2312 Code: 0xC8CB ==> Row:40 Col:43 */
    {0x4EBB,0xE9D8}, /* 亻: GB2312 Code: 0xD8E9 ==> Row:56 Col:73 */
    {0x4EBF,0xDAD2}, /* 億: GB2312 Code: 0xD2DA ==> Row:50 Col:58 */
    {0x4EC0,0xB2CA}, /* 什: GB2312 Code: 0xCAB2 ==> Row:42 Col:18 */
    {0x4EC1,0xCAC8}, /* 仁: GB2312 Code: 0xC8CA ==> Row:40 Col:42 */
    {0x4EC2,0xECD8}, /* 仂: GB2312 Code: 0xD8EC ==> Row:56 Col:76 */
    {0x4EC3,0xEAD8}, /* 仃: GB2312 Code: 0xD8EA ==> Row:56 Col:74 */
    {0x4EC4,0xC6D8}, /* 仄: GB2312 Code: 0xD8C6 ==> Row:56 Col:38 */
    {0x4EC5,0xF6BD}, /* 僅: GB2312 Code: 0xBDF6 ==> Row:29 Col:86 */
    {0x4EC6,0xCDC6}, /* 僕: GB2312 Code: 0xC6CD ==> Row:38 Col:45 */
    {0x4EC7,0xF0B3}, /* 仇: GB2312 Code: 0xB3F0 ==> Row:19 Col:80 */
    {0x4EC9,0xEBD8}, /* 仉: GB2312 Code: 0xD8EB ==> Row:56 Col:75 */
    {0x4ECA,0xF1BD}, /* 今: GB2312 Code: 0xBDF1 ==> Row:29 Col:81 */
    {0x4ECB,0xE9BD}, /* 介: GB2312 Code: 0xBDE9 ==> Row:29 Col:73 */
    {0x4ECD,0xD4C8}, /* 仍: GB2312 Code: 0xC8D4 ==> Row:40 Col:52 */
    {0x4ECE,0xD3B4}, /* 從: GB2312 Code: 0xB4D3 ==> Row:20 Col:51 */
    {0x4ED1,0xD8C2}, /* 侖: GB2312 Code: 0xC2D8 ==> Row:34 Col:56 */
    {0x4ED3,0xD6B2}, /* 倉: GB2312 Code: 0xB2D6 ==> Row:18 Col:54 */
    {0x4ED4,0xD0D7}, /* 仔: GB2312 Code: 0xD7D0 ==> Row:55 Col:48 */
    {0x4ED5,0xCBCA}, /* 仕: GB2312 Code: 0xCACB ==> Row:42 Col:43 */
    {0x4ED6,0xFBCB}, /* 他: GB2312 Code: 0xCBFB ==> Row:43 Col:91 */
    {0x4ED7,0xCCD5}, /* 仗: GB2312 Code: 0xD5CC ==> Row:53 Col:44 */
    {0x4ED8,0xB6B8}, /* 付: GB2312 Code: 0xB8B6 ==> Row:24 Col:22 */
    {0x4ED9,0xC9CF}, /* 仙: GB2312 Code: 0xCFC9 ==> Row:47 Col:41 */
    {0x4EDD,0xDAD9}, /* 仝: GB2312 Code: 0xD9DA ==> Row:57 Col:58 */
    {0x4EDE,0xF0D8}, /* 仞: GB2312 Code: 0xD8F0 ==> Row:56 Col:80 */
    {0x4EDF,0xAAC7}, /* 仟: GB2312 Code: 0xC7AA ==> Row:39 Col:10 */
    {0x4EE1,0xEED8}, /* 仡: GB2312 Code: 0xD8EE ==> Row:56 Col:78 */
    {0x4EE3,0xFAB4}, /* 代: GB2312 Code: 0xB4FA ==> Row:20 Col:90 */
    {0x4EE4,0xEEC1}, /* 令: GB2312 Code: 0xC1EE ==> Row:33 Col:78 */
    {0x4EE5,0xD4D2}, /* 以: GB2312 Code: 0xD2D4 ==> Row:50 Col:52 */
    {0x4EE8,0xEDD8}, /* 仨: GB2312 Code: 0xD8ED ==> Row:56 Col:77 */
    {0x4EEA,0xC7D2}, /* 儀: GB2312 Code: 0xD2C7 ==> Row:50 Col:39 */
    {0x4EEB,0xEFD8}, /* 仫: GB2312 Code: 0xD8EF ==> Row:56 Col:79 */
    {0x4EEC,0xC7C3}, /* 們: GB2312 Code: 0xC3C7 ==> Row:35 Col:39 */
    {0x4EF0,0xF6D1}, /* 仰: GB2312 Code: 0xD1F6 ==> Row:49 Col:86 */
    {0x4EF2,0xD9D6}, /* 仲: GB2312 Code: 0xD6D9 ==> Row:54 Col:57 */
    {0x4EF3,0xF2D8}, /* 仳: GB2312 Code: 0xD8F2 ==> Row:56 Col:82 */
    {0x4EF5,0xF5D8}, /* 仵: GB2312 Code: 0xD8F5 ==> Row:56 Col:85 */
    {0x4EF6,0xFEBC}, /* 件: GB2312 Code: 0xBCFE ==> Row:28 Col:94 */
    {0x4EF7,0xDBBC}, /* 價: GB2312 Code: 0xBCDB ==> Row:28 Col:59 */
    {0x4EFB,0xCEC8}, /* 任: GB2312 Code: 0xC8CE ==> Row:40 Col:46 */
    {0x4EFD,0xDDB7}, /* 份: GB2312 Code: 0xB7DD ==> Row:23 Col:61 */
    {0x4EFF,0xC2B7}, /* 仿: GB2312 Code: 0xB7C2 ==> Row:23 Col:34 */
    {0x4F01,0xF3C6}, /* 企: GB2312 Code: 0xC6F3 ==> Row:38 Col:83 */
    {0x4F09,0xF8D8}, /* 伉: GB2312 Code: 0xD8F8 ==> Row:56 Col:88 */
    {0x4F0A,0xC1D2}, /* 伊: GB2312 Code: 0xD2C1 ==> Row:50 Col:33 */
    {0x4F0D,0xE9CE}, /* 伍: GB2312 Code: 0xCEE9 ==> Row:46 Col:73 */
    {0x4F0E,0xBFBC}, /* 伎: GB2312 Code: 0xBCBF ==> Row:28 Col:31 */
    {0x4F0F,0xFCB7}, /* 伏: GB2312 Code: 0xB7FC ==> Row:23 Col:92 */
    {0x4F10,0xA5B7}, /* 伐: GB2312 Code: 0xB7A5 ==> Row:23 Col:05 */
    {0x4F11,0xDDD0}, /* 休: GB2312 Code: 0xD0DD ==> Row:48 Col:61 */
    {0x4F17,0xDAD6}, /* 眾: GB2312 Code: 0xD6DA ==> Row:54 Col:58 */
    {0x4F18,0xC5D3}, /* 優: GB2312 Code: 0xD3C5 ==> Row:51 Col:37 */
    {0x4F19,0xEFBB}, /* 夥: GB2312 Code: 0xBBEF ==> Row:27 Col:79 */
    {0x4F1A,0xE1BB}, /* 會: GB2312 Code: 0xBBE1 ==> Row:27 Col:65 */
    {0x4F1B,0xF1D8}, /* 傴: GB2312 Code: 0xD8F1 ==> Row:56 Col:81 */
    {0x4F1E,0xA1C9}, /* 傘: GB2312 Code: 0xC9A1 ==> Row:41 Col:01 */
    {0x4F1F,0xB0CE}, /* 偉: GB2312 Code: 0xCEB0 ==> Row:46 Col:16 */
    {0x4F20,0xABB4}, /* 傳: GB2312 Code: 0xB4AB ==> Row:20 Col:11 */
    {0x4F22,0xF3D8}, /* 伢: GB2312 Code: 0xD8F3 ==> Row:56 Col:83 */
    {0x4F24,0xCBC9}, /* 傷: GB2312 Code: 0xC9CB ==> Row:41 Col:43 */
    {0x4F25,0xF6D8}, /* 倀: GB2312 Code: 0xD8F6 ==> Row:56 Col:86 */
    {0x4F26,0xD7C2}, /* 倫: GB2312 Code: 0xC2D7 ==> Row:34 Col:55 */
    {0x4F27,0xF7D8}, /* 傖: GB2312 Code: 0xD8F7 ==> Row:56 Col:87 */
    {0x4F2A,0xB1CE}, /* 偽: GB2312 Code: 0xCEB1 ==> Row:46 Col:17 */
    {0x4F2B,0xF9D8}, /* 佇: GB2312 Code: 0xD8F9 ==> Row:56 Col:89 */
    {0x4F2F,0xAEB2}, /* 伯: GB2312 Code: 0xB2AE ==> Row:18 Col:14 */
    {0x4F30,0xC0B9}, /* 估: GB2312 Code: 0xB9C0 ==> Row:25 Col:32 */
    {0x4F32,0xA3D9}, /* 伲: GB2312 Code: 0xD9A3 ==> Row:57 Col:03 */
    {0x4F34,0xE9B0}, /* 伴: GB2312 Code: 0xB0E9 ==> Row:16 Col:73 */
    {0x4F36,0xE6C1}, /* 伶: GB2312 Code: 0xC1E6 ==> Row:33 Col:70 */
    {0x4F38,0xECC9}, /* 伸: GB2312 Code: 0xC9EC ==> Row:41 Col:76 */
    {0x4F3A,0xC5CB}, /* 伺: GB2312 Code: 0xCBC5 ==> Row:43 Col:37 */
    {0x4F3C,0xC6CB}, /* 似: GB2312 Code: 0xCBC6 ==> Row:43 Col:38 */
    {0x4F3D,0xA4D9}, /* 伽: GB2312 Code: 0xD9A4 ==> Row:57 Col:04 */
    {0x4F43,0xE8B5}, /* 佃: GB2312 Code: 0xB5E8 ==> Row:21 Col:72 */
    {0x4F46,0xABB5}, /* 但: GB2312 Code: 0xB5AB ==> Row:21 Col:11 */
    {0x4F4D,0xBBCE}, /* 位: GB2312 Code: 0xCEBB ==> Row:46 Col:27 */
    {0x4F4E,0xCDB5}, /* 低: GB2312 Code: 0xB5CD ==> Row:21 Col:45 */
    {0x4F4F,0xA1D7}, /* 住: GB2312 Code: 0xD7A1 ==> Row:55 Col:01 */
    {0x4F50,0xF4D7}, /* 佐: GB2312 Code: 0xD7F4 ==> Row:55 Col:84 */
    {0x4F51,0xD3D3}, /* 佑: GB2312 Code: 0xD3D3 ==> Row:51 Col:51 */
    {0x4F53,0xE5CC}, /* 體: GB2312 Code: 0xCCE5 ==> Row:44 Col:69 */
    {0x4F55,0xCEBA}, /* 何: GB2312 Code: 0xBACE ==> Row:26 Col:46 */
    {0x4F57,0xA2D9}, /* 佗: GB2312 Code: 0xD9A2 ==> Row:57 Col:02 */
    {0x4F58,0xDCD9}, /* 佘: GB2312 Code: 0xD9DC ==> Row:57 Col:60 */
    {0x4F59,0xE0D3}, /* 餘: GB2312 Code: 0xD3E0 ==> Row:51 Col:64 */
    {0x4F5A,0xFDD8}, /* 佚: GB2312 Code: 0xD8FD ==> Row:56 Col:93 */
    {0x4F5B,0xF0B7}, /* 佛: GB2312 Code: 0xB7F0 ==> Row:23 Col:80 */
    {0x4F5C,0xF7D7}, /* 作: GB2312 Code: 0xD7F7 ==> Row:55 Col:87 */
    {0x4F5D,0xFED8}, /* 佝: GB2312 Code: 0xD8FE ==> Row:56 Col:94 */
    {0x4F5E,0xFAD8}, /* 佞: GB2312 Code: 0xD8FA ==> Row:56 Col:90 */
    {0x4F5F,0xA1D9}, /* 佟: GB2312 Code: 0xD9A1 ==> Row:57 Col:01 */
    {0x4F60,0xE3C4}, /* 你: GB2312 Code: 0xC4E3 ==> Row:36 Col:67 */
    {0x4F63,0xB6D3}, /* 傭: GB2312 Code: 0xD3B6 ==> Row:51 Col:22 */
    {0x4F64,0xF4D8}, /* 佤: GB2312 Code: 0xD8F4 ==> Row:56 Col:84 */
    {0x4F65,0xDDD9}, /* 僉: GB2312 Code: 0xD9DD ==> Row:57 Col:61 */
    {0x4F67,0xFBD8}, /* 佧: GB2312 Code: 0xD8FB ==> Row:56 Col:91 */
    {0x4F69,0xE5C5}, /* 佩: GB2312 Code: 0xC5E5 ==> Row:37 Col:69 */
    {0x4F6C,0xD0C0}, /* 佬: GB2312 Code: 0xC0D0 ==> Row:32 Col:48 */
    {0x4F6F,0xF0D1}, /* 佯: GB2312 Code: 0xD1F0 ==> Row:49 Col:80 */
    {0x4F70,0xDBB0}, /* 佰: GB2312 Code: 0xB0DB ==> Row:16 Col:59 */
    {0x4F73,0xD1BC}, /* 佳: GB2312 Code: 0xBCD1 ==> Row:28 Col:49 */
    {0x4F74,0xA6D9}, /* 佴: GB2312 Code: 0xD9A6 ==> Row:57 Col:06 */
    {0x4F76,0xA5D9}, /* 佶: GB2312 Code: 0xD9A5 ==> Row:57 Col:05 */
    {0x4F7B,0xACD9}, /* 佻: GB2312 Code: 0xD9AC ==> Row:57 Col:12 */
    {0x4F7C,0xAED9}, /* 佼: GB2312 Code: 0xD9AE ==> Row:57 Col:14 */
    {0x4F7E,0xABD9}, /* 佾: GB2312 Code: 0xD9AB ==> Row:57 Col:11 */
    {0x4F7F,0xB9CA}, /* 使: GB2312 Code: 0xCAB9 ==> Row:42 Col:25 */
    {0x4F83,0xA9D9}, /* 侃: GB2312 Code: 0xD9A9 ==> Row:57 Col:09 */
    {0x4F84,0xB6D6}, /* 侄: GB2312 Code: 0xD6B6 ==> Row:54 Col:22 */
    {0x4F88,0xDEB3}, /* 侈: GB2312 Code: 0xB3DE ==> Row:19 Col:62 */
    {0x4F89,0xA8D9}, /* 侉: GB2312 Code: 0xD9A8 ==> Row:57 Col:08 */
    {0x4F8B,0xFDC0}, /* 例: GB2312 Code: 0xC0FD ==> Row:32 Col:93 */
    {0x4F8D,0xCCCA}, /* 侍: GB2312 Code: 0xCACC ==> Row:42 Col:44 */
    {0x4F8F,0xAAD9}, /* 侏: GB2312 Code: 0xD9AA ==> Row:57 Col:10 */
    {0x4F91,0xA7D9}, /* 侑: GB2312 Code: 0xD9A7 ==> Row:57 Col:07 */
    {0x4F94,0xB0D9}, /* 侔: GB2312 Code: 0xD9B0 ==> Row:57 Col:16 */
    {0x4F97,0xB1B6}, /* 侗: GB2312 Code: 0xB6B1 ==> Row:22 Col:17 */
    {0x4F9B,0xA9B9}, /* 供: GB2312 Code: 0xB9A9 ==> Row:25 Col:09 */
    {0x4F9D,0xC0D2}, /* 依: GB2312 Code: 0xD2C0 ==> Row:50 Col:32 */
    {0x4FA0,0xC0CF}, /* 俠: GB2312 Code: 0xCFC0 ==> Row:47 Col:32 */
    {0x4FA3,0xC2C2}, /* 侶: GB2312 Code: 0xC2C2 ==> Row:34 Col:34 */
    {0x4FA5,0xC4BD}, /* 僥: GB2312 Code: 0xBDC4 ==> Row:29 Col:36 */
    {0x4FA6,0xECD5}, /* 偵: GB2312 Code: 0xD5EC ==> Row:53 Col:76 */
    {0x4FA7,0xE0B2}, /* 側: GB2312 Code: 0xB2E0 ==> Row:18 Col:64 */
    {0x4FA8,0xC8C7}, /* 僑: GB2312 Code: 0xC7C8 ==> Row:39 Col:40 */
    {0x4FA9,0xEBBF}, /* 儈: GB2312 Code: 0xBFEB ==> Row:31 Col:75 */
    {0x4FAA,0xADD9}, /* 儕: GB2312 Code: 0xD9AD ==> Row:57 Col:13 */
    {0x4FAC,0xAFD9}, /* 儂: GB2312 Code: 0xD9AF ==> Row:57 Col:15 */
    {0x4FAE,0xEACE}, /* 侮: GB2312 Code: 0xCEEA ==> Row:46 Col:74 */
    {0x4FAF,0xEEBA}, /* 侯: GB2312 Code: 0xBAEE ==> Row:26 Col:78 */
    {0x4FB5,0xD6C7}, /* 侵: GB2312 Code: 0xC7D6 ==> Row:39 Col:54 */
    {0x4FBF,0xE3B1}, /* 便: GB2312 Code: 0xB1E3 ==> Row:17 Col:67 */
    {0x4FC3,0xD9B4}, /* 促: GB2312 Code: 0xB4D9 ==> Row:20 Col:57 */
    {0x4FC4,0xEDB6}, /* 俄: GB2312 Code: 0xB6ED ==> Row:22 Col:77 */
    {0x4FC5,0xB4D9}, /* 俅: GB2312 Code: 0xD9B4 ==> Row:57 Col:20 */
    {0x4FCA,0xA1BF}, /* 俊: GB2312 Code: 0xBFA1 ==> Row:31 Col:01 */
    {0x4FCE,0xDED9}, /* 俎: GB2312 Code: 0xD9DE ==> Row:57 Col:62 */
    {0x4FCF,0xCEC7}, /* 俏: GB2312 Code: 0xC7CE ==> Row:39 Col:46 */
    {0x4FD0,0xFEC0}, /* 俐: GB2312 Code: 0xC0FE ==> Row:32 Col:94 */
    {0x4FD1,0xB8D9}, /* 俑: GB2312 Code: 0xD9B8 ==> Row:57 Col:24 */
    {0x4FD7,0xD7CB}, /* 俗: GB2312 Code: 0xCBD7 ==> Row:43 Col:55 */
    {0x4FD8,0xFDB7}, /* 俘: GB2312 Code: 0xB7FD ==> Row:23 Col:93 */
    {0x4FDA,0xB5D9}, /* 俚: GB2312 Code: 0xD9B5 ==> Row:57 Col:21 */
    {0x4FDC,0xB7D9}, /* 俜: GB2312 Code: 0xD9B7 ==> Row:57 Col:23 */
    {0x4FDD,0xA3B1}, /* 保: GB2312 Code: 0xB1A3 ==> Row:17 Col:03 */
    {0x4FDE,0xE1D3}, /* 俞: GB2312 Code: 0xD3E1 ==> Row:51 Col:65 */
    {0x4FDF,0xB9D9}, /* 俟: GB2312 Code: 0xD9B9 ==> Row:57 Col:25 */
    {0x4FE1,0xC5D0}, /* 信: GB2312 Code: 0xD0C5 ==> Row:48 Col:37 */
    {0x4FE3,0xB6D9}, /* 俁: GB2312 Code: 0xD9B6 ==> Row:57 Col:22 */
    {0x4FE6,0xB1D9}, /* 儔: GB2312 Code: 0xD9B1 ==> Row:57 Col:17 */
    {0x4FE8,0xB2D9}, /* 儼: GB2312 Code: 0xD9B2 ==> Row:57 Col:18 */
    {0x4FE9,0xA9C1}, /* 倆: GB2312 Code: 0xC1A9 ==> Row:33 Col:09 */
    {0x4FEA,0xB3D9}, /* 儷: GB2312 Code: 0xD9B3 ==> Row:57 Col:19 */
    {0x4FED,0xF3BC}, /* 儉: GB2312 Code: 0xBCF3 ==> Row:28 Col:83 */
    {0x4FEE,0xDED0}, /* 修: GB2312 Code: 0xD0DE ==> Row:48 Col:62 */
    {0x4FEF,0xA9B8}, /* 俯: GB2312 Code: 0xB8A9 ==> Row:24 Col:09 */
    {0x4FF1,0xE3BE}, /* 俱: GB2312 Code: 0xBEE3 ==> Row:30 Col:67 */
    {0x4FF3,0xBDD9}, /* 俳: GB2312 Code: 0xD9BD ==> Row:57 Col:29 */
    {0x4FF8,0xBAD9}, /* 俸: GB2312 Code: 0xD9BA ==> Row:57 Col:26 */
    {0x4FFA,0xB3B0}, /* 俺: GB2312 Code: 0xB0B3 ==> Row:16 Col:19 */
    {0x4FFE,0xC2D9}, /* 俾: GB2312 Code: 0xD9C2 ==> Row:57 Col:34 */
    {0x500C,0xC4D9}, /* 倌: GB2312 Code: 0xD9C4 ==> Row:57 Col:36 */
    {0x500D,0xB6B1}, /* 倍: GB2312 Code: 0xB1B6 ==> Row:17 Col:22 */
    {0x500F,0xBFD9}, /* 倏: GB2312 Code: 0xD9BF ==> Row:57 Col:31 */
    {0x5012,0xB9B5}, /* 倒: GB2312 Code: 0xB5B9 ==> Row:21 Col:25 */
    {0x5014,0xF3BE}, /* 倔: GB2312 Code: 0xBEF3 ==> Row:30 Col:83 */
    {0x5018,0xC8CC}, /* 倘: GB2312 Code: 0xCCC8 ==> Row:44 Col:40 */
    {0x5019,0xF2BA}, /* 候: GB2312 Code: 0xBAF2 ==> Row:26 Col:82 */
    {0x501A,0xD0D2}, /* 倚: GB2312 Code: 0xD2D0 ==> Row:50 Col:48 */
    {0x501C,0xC3D9}, /* 倜: GB2312 Code: 0xD9C3 ==> Row:57 Col:35 */
    {0x501F,0xE8BD}, /* 借: GB2312 Code: 0xBDE8 ==> Row:29 Col:72 */
    {0x5021,0xABB3}, /* 倡: GB2312 Code: 0xB3AB ==> Row:19 Col:11 */
    {0x5025,0xC5D9}, /* 倥: GB2312 Code: 0xD9C5 ==> Row:57 Col:37 */
    {0x5026,0xEBBE}, /* 倦: GB2312 Code: 0xBEEB ==> Row:30 Col:75 */
    {0x5028,0xC6D9}, /* 倨: GB2312 Code: 0xD9C6 ==> Row:57 Col:38 */
    {0x5029,0xBBD9}, /* 倩: GB2312 Code: 0xD9BB ==> Row:57 Col:27 */
    {0x502A,0xDFC4}, /* 倪: GB2312 Code: 0xC4DF ==> Row:36 Col:63 */
    {0x502C,0xBED9}, /* 倬: GB2312 Code: 0xD9BE ==> Row:57 Col:30 */
    {0x502D,0xC1D9}, /* 倭: GB2312 Code: 0xD9C1 ==> Row:57 Col:33 */
    {0x502E,0xC0D9}, /* 倮: GB2312 Code: 0xD9C0 ==> Row:57 Col:32 */
    {0x503A,0xAED5}, /* 債: GB2312 Code: 0xD5AE ==> Row:53 Col:14 */
    {0x503C,0xB5D6}, /* 值: GB2312 Code: 0xD6B5 ==> Row:54 Col:21 */
    {0x503E,0xE3C7}, /* 傾: GB2312 Code: 0xC7E3 ==> Row:39 Col:67 */
    {0x5043,0xC8D9}, /* 偃: GB2312 Code: 0xD9C8 ==> Row:57 Col:40 */
    {0x5047,0xD9BC}, /* 假: GB2312 Code: 0xBCD9 ==> Row:28 Col:57 */
    {0x5048,0xCAD9}, /* 偈: GB2312 Code: 0xD9CA ==> Row:57 Col:42 */
    {0x504C,0xBCD9}, /* 偌: GB2312 Code: 0xD9BC ==> Row:57 Col:28 */
    {0x504E,0xCBD9}, /* 偎: GB2312 Code: 0xD9CB ==> Row:57 Col:43 */
    {0x504F,0xABC6}, /* 偏: GB2312 Code: 0xC6AB ==> Row:38 Col:11 */
    {0x5055,0xC9D9}, /* 偕: GB2312 Code: 0xD9C9 ==> Row:57 Col:41 */
    {0x505A,0xF6D7}, /* 做: GB2312 Code: 0xD7F6 ==> Row:55 Col:86 */
    {0x505C,0xA3CD}, /* 停: GB2312 Code: 0xCDA3 ==> Row:45 Col:03 */
    {0x5065,0xA1BD}, /* 健: GB2312 Code: 0xBDA1 ==> Row:29 Col:01 */
    {0x506C,0xCCD9}, /* 傯: GB2312 Code: 0xD9CC ==> Row:57 Col:44 */
    {0x5076,0xBCC5}, /* 偶: GB2312 Code: 0xC5BC ==> Row:37 Col:28 */
    {0x5077,0xB5CD}, /* 偷: GB2312 Code: 0xCDB5 ==> Row:45 Col:21 */
    {0x507B,0xCDD9}, /* 僂: GB2312 Code: 0xD9CD ==> Row:57 Col:45 */
    {0x507E,0xC7D9}, /* 僨: GB2312 Code: 0xD9C7 ==> Row:57 Col:39 */
    {0x507F,0xA5B3}, /* 償: GB2312 Code: 0xB3A5 ==> Row:19 Col:05 */
    {0x5080,0xFEBF}, /* 傀: GB2312 Code: 0xBFFE ==> Row:31 Col:94 */
    {0x5085,0xB5B8}, /* 傅: GB2312 Code: 0xB8B5 ==> Row:24 Col:21 */
    {0x5088,0xFCC0}, /* 傈: GB2312 Code