Linux下音樂播放器的實現
阿新 • • 發佈:2019-02-10
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