找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3022|回复: 0
收起左侧

unicode转为gb2312--转发

[复制链接]
ID:171547 发表于 2017-3-17 15:35 | 显示全部楼层 |阅读模式
  1. //使用到的文件有unicode转gb2312的映射表 默认是从gb2312转unicode  所以注释掉的部分是把表反序。
  2. //不要吐槽我的渣渣排序算法,赶时间的 而且是WIN 慢点就慢点


  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. //#include <windows.h>


  6. #define MAX_UNI_INDEX  6768

  7. //uint16_t const table_gb2312_to_unicode[MAX_UNI_INDEX][2];
  8. //uint16_t const *const p_table_gb2312_to_unicode = &table_gb2312_to_unicode[0][0];

  9. //uint16_t table_sorted_unicode[MAX_UNI_INDEX];
  10. //uint16_t table_sorted_gb2312[MAX_UNI_INDEX];
  11. //uint16_t table_sorted_section_table[MAX_UNI_INDEX];

  12. #if 0
  13. uint16_t const sorted_unicode[MAX_UNI_INDEX];
  14. uint16_t const sorted_gb2312[MAX_UNI_INDEX];

  15. const uint32_t c_un_sorted_value = 0xFFFFFFFF;
  16. uint32_t sort_result[MAX_UNI_INDEX];

  17. void init_sort_result_buffer(void)
  18. {
  19.     for (int i = 0; i < MAX_UNI_INDEX; i++){
  20.         sort_result[i] = c_un_sorted_value;
  21.     }
  22. }

  23. void sort_form_zero_to_end(void)
  24. {
  25.     uint16_t current_min_index = 0;
  26.     uint16_t min_tmp = c_un_sorted_value;
  27.     for (int i = 0; i < MAX_UNI_INDEX; i++){
  28.         for (int j = 0; j < MAX_UNI_INDEX; j++){
  29.             if (sort_result[j] == c_un_sorted_value){
  30. //                uint16_t tmp = p_table_gb2312_to_unicode[2*j+1];    //sort by gb2312
  31.                 uint16_t tmp = p_table_gb2312_to_unicode[2*j];        //sort by unicode
  32.                 if (tmp < min_tmp){
  33.                     current_min_index = j;
  34.                     min_tmp = tmp;
  35.                 }
  36.             }
  37.         }
  38.         sort_result[current_min_index] = i;
  39.         min_tmp = c_un_sorted_value;
  40.         current_min_index = 0;
  41.     }
  42. }


  43. void get_group_unicode_gb2312(void)
  44. {
  45.     for (int i = 0; i<MAX_UNI_INDEX;i++){
  46.         for (int j = 0; j < MAX_UNI_INDEX; j++){
  47.             if (sort_result[j] == i){
  48.                 uint16_t tmp_gb2312 = p_table_gb2312_to_unicode[2 * j + 1];

  49.                 uint8_t tmp_h_8 = tmp_gb2312 >> 8;
  50.                 uint8_t tmp_l_8 = tmp_gb2312 & 0xFF;

  51.                 //find sort
  52.                 table_sorted_unicode[i] = p_table_gb2312_to_unicode[2 * j];
  53.                 table_sorted_gb2312[i] = tmp_gb2312;
  54.             }
  55.         }
  56.     }

  57. }


  58. void printf_to_file(void)
  59. {
  60.     int file_write = fopen("test.c","w");


  61.     fprintf(file_write,"uint16_t const sorted_unicode[MAX_UNI_INDEX]]={\r\n");
  62.     for (int i = 0; i < MAX_UNI_INDEX; i++){
  63.         fprintf(file_write, "0x%04X,\n", table_sorted_unicode[i]);
  64.     }
  65.     fprintf(file_write, "};\n\n");


  66.     fprintf(file_write, "uint16_t const sorted_gb2312[MAX_UNI_INDEX]]={\r\n");
  67.     for (int i = 0; i < MAX_UNI_INDEX; i++){
  68.         fprintf(file_write, "0x%04X,\n", table_sorted_gb2312[i]);
  69.     }
  70.     fprintf(file_write, "};\n\n");
  71.     fclose(file_write);
  72. }

  73. #endif



  74. int quick_find(uint16_t const * p_data, uint16_t unicode, int min, int max)
  75. {
  76.     const int max_serch_cnt_ctrl = 15;
  77.     int ret = -2;
  78.     int mid;
  79.     int i;
  80.     uint16_t cmp_min;
  81.     uint16_t cmp_max;
  82.     uint16_t cmp_mid;


  83.     for (i = 0; i < max_serch_cnt_ctrl; i++){
  84.         cmp_min = p_data[min];
  85.         cmp_max = p_data[max];

  86.         if (cmp_max == unicode){
  87.             ret = max;
  88.             break;
  89.         }
  90.         else if (cmp_min == unicode){

  91.             ret = min;
  92.             break;
  93.         }
  94.         else if (max == min + 1){
  95.             break;
  96.             //return -1;
  97.         }

  98.         mid = (max + min) / 2;

  99.         cmp_mid = p_data[mid];


  100.         if (unicode > cmp_mid){
  101.             min = mid;
  102.             continue;
  103.             //return quick_find(p_data, unicode, mid, max);
  104.         }
  105.         else{
  106.             max = mid;
  107.             continue;
  108.             //return quick_find(p_data, unicode, min, mid);
  109.         }
  110.     }

  111.     return ret;
  112. }


  113. uint16_t const sorted_unicode[MAX_UNI_INDEX];
  114. uint16_t const sorted_gb2312[MAX_UNI_INDEX];

  115. uint8_t buffer[32];


  116. void print_lib_font(uint8_t* pData)
  117. {
  118.     for (int i = 0; i<16;i++){
  119.         for (int j = 0; j < 2; j++){
  120.             for (int k = 0; k<8; k++){
  121.                 uint8_t bit_fix = 0x80 >> k;
  122.                 int tmp = pData[i*2 + j] & bit_fix;

  123.                 if (tmp){
  124.                     printf("#");
  125.                 }
  126.                 else{
  127.                     printf("-");
  128.                 }
  129.             }
  130.         }
  131.         printf("\n");
  132.     }
  133. }

  134. void test_lib(void)
  135. {
  136.     int fp;
  137. //    uint16_t test_1 = 0x3158;    //口

  138.     uint16_t unicode = 0x68EE;    //UNICODE OF "森"
  139.     char c[] = "一";


  140.     int result = quick_find(sorted_unicode, unicode, 0, MAX_UNI_INDEX);

  141.     uint16_t gb2312 = sorted_gb2312[result];

  142.     c[0] = gb2312 >> 8;
  143.     c[1] = gb2312 & 0xFF;

  144.     uint8_t h = c[0] - 0xA0;
  145.     uint8_t l = c[1] - 0xA0;

  146.     int t_1 = ((h - 1) * 94 + (l - 1)) * 32;

  147. //    t_1 = 32;

  148.     fp = fopen("HZK16", "rb");

  149.     fseek(fp, t_1, 0);

  150.     fread(buffer, 32, 1, fp);
  151.     fclose(fp);

  152.     print_lib_font(buffer);
  153. }

  154. int main(int char_c, char** char_v)
  155. {

  156.     //init_sort_result_buffer();

  157.     //sort_form_zero_to_end();

  158.     //get_group_unicode_gb2312();

  159.     //printf_to_file();

  160.     //{ 0x7F36, 0xF3BE },//GB2312:缶

  161. //    int resule = quick_find(table_sorted_unicode, 0x7F36, 0, MAX_UNI_INDEX - 1);

  162. //    printf("\nfind_gb2312_is:0x%04X\nshould be equal to 0xF3BE", table_sorted_gb2312[resule]);

  163. //    printf("缶 is  %x","缶");

  164.     test_lib();


  165. //    system("pause");

  166.     return 0;
  167. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表