UNICODE 转GB2312 纯C语言 映射法 另外的文件评论区网盘

//使用到的文件有unicode转gb2312的映射表 默认是从gb2312转unicode  所以注释掉的部分是把表反序。
//不要吐槽我的渣渣排序算法,赶时间的 而且是WIN 慢点就慢点

#include <stdint.h>
#include <stdbool.h>
//#include <windows.h>

#define MAX_UNI_INDEX  6768

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

//uint16_t table_sorted_unicode[MAX_UNI_INDEX];
//uint16_t table_sorted_gb2312[MAX_UNI_INDEX];
//uint16_t table_sorted_section_table[MAX_UNI_INDEX];

#if 0
uint16_t const sorted_unicode[MAX_UNI_INDEX];
uint16_t const sorted_gb2312[MAX_UNI_INDEX];

const uint32_t c_un_sorted_value = 0xFFFFFFFF;
uint32_t sort_result[MAX_UNI_INDEX];

void init_sort_result_buffer(void)
{
    for (int i = 0; i < MAX_UNI_INDEX; i++){
        sort_result[i] = c_un_sorted_value;
    }
}

void sort_form_zero_to_end(void)
{
    uint16_t current_min_index = 0;
    uint16_t min_tmp = c_un_sorted_value;
    for (int i = 0; i < MAX_UNI_INDEX; i++){
        for (int j = 0; j < MAX_UNI_INDEX; j++){
            if (sort_result[j] == c_un_sorted_value){
//                uint16_t tmp = p_table_gb2312_to_unicode[2*j+1];    //sort by gb2312
                uint16_t tmp = p_table_gb2312_to_unicode[2*j];        //sort by unicode
                if (tmp < min_tmp){
                    current_min_index = j;
                    min_tmp = tmp;
                }
            }
        }
        sort_result[current_min_index] = i;
        min_tmp = c_un_sorted_value;
        current_min_index = 0;
    }
}

void get_group_unicode_gb2312(void)
{
    for (int i = 0; i<MAX_UNI_INDEX;i++){
        for (int j = 0; j < MAX_UNI_INDEX; j++){
            if (sort_result[j] == i){
                uint16_t tmp_gb2312 = p_table_gb2312_to_unicode[2 * j + 1];

                uint8_t tmp_h_8 = tmp_gb2312 >> 8;
                uint8_t tmp_l_8 = tmp_gb2312 & 0xFF;

                //find sort
                table_sorted_unicode[i] = p_table_gb2312_to_unicode[2 * j];
                table_sorted_gb2312[i] = tmp_gb2312;
            }
        }
    }

}

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

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

    fprintf(file_write, "uint16_t const sorted_gb2312[MAX_UNI_INDEX]]={\r\n");
    for (int i = 0; i < MAX_UNI_INDEX; i++){
        fprintf(file_write, "0x%04X,\n", table_sorted_gb2312[i]);
    }
    fprintf(file_write, "};\n\n");
    fclose(file_write);
}

#endif

int quick_find(uint16_t const * p_data, uint16_t unicode, int min, int max)
{
    const int max_serch_cnt_ctrl = 15;
    int ret = -2;
    int mid;
    int i;
    uint16_t cmp_min;
    uint16_t cmp_max;
    uint16_t cmp_mid;

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

        if (cmp_max == unicode){
            ret = max;
            break;
        }
        else if (cmp_min == unicode){

            ret = min;
            break;
        }
        else if (max == min + 1){
            break;
            //return -1;
        }

        mid = (max + min) / 2;

        cmp_mid = p_data[mid];

        if (unicode > cmp_mid){
            min = mid;
            continue;
            //return quick_find(p_data, unicode, mid, max);
        }
        else{
            max = mid;
            continue;
            //return quick_find(p_data, unicode, min, mid);
        }
    }

    return ret;
}

uint16_t const sorted_unicode[MAX_UNI_INDEX];
uint16_t const sorted_gb2312[MAX_UNI_INDEX];

uint8_t buffer[32];

void print_lib_font(uint8_t* pData)
{
    for (int i = 0; i<16;i++){
        for (int j = 0; j < 2; j++){
            for (int k = 0; k<8; k++){
                uint8_t bit_fix = 0x80 >> k;
                int tmp = pData[i*2 + j] & bit_fix;

                if (tmp){
                    printf("#");
                }
                else{
                    printf("-");
                }
            }
        }
        printf("\n");
    }
}

void test_lib(void)
{
    int fp;
//    uint16_t test_1 = 0x3158;    //口

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

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

    uint16_t gb2312 = sorted_gb2312[result];

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

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

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

//    t_1 = 32;

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

    fseek(fp, t_1, 0);

    fread(buffer, 32, 1, fp);
    fclose(fp);

    print_lib_font(buffer);
}

int main(int char_c, char** char_v)
{

    //init_sort_result_buffer();

    //sort_form_zero_to_end();

    //get_group_unicode_gb2312();

    //printf_to_file();

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

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

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

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

    test_lib();

//    system("pause");

    return 0;
}
时间: 2024-10-26 11:07:33

UNICODE 转GB2312 纯C语言 映射法 另外的文件评论区网盘的相关文章

普通青年的状态机,纯C语言

我们第一次接触到状态机,是在数字电路课程里.计数器.串行奇偶检校.检验三个1连续出现的报错电路 等,都需要状态机作为模型.实现这些功能的电路,与状态机的状态转换图.状态转换表都是等价的. 后来,我们再接触状态机,是在编译原理课程里.状态机用于描述与正则表达式匹配的字符串. 再后来,我们在GUI界面设计中,需要设置一些控件在某些条件下 禁用,某些条件下使能,某些条件下打个对号.这也可以用状态机模型来控制. 1. 不要写成 消息响应/事件处理 状态机和消息响应都是 双层 switch-case 结构

geek青年的状态机,查表,纯C语言实现

1. 问题的提出,抽象 建一,不止是他,不少人跟我讨论过这样的问题:如何才能保证在需求变更.扩充的情况下,程序的主体部分不动呢? 这是一个非常深刻和艰难的问题.在进入实质讨论之前,我们还得先明确什么是"主体",就是我们不希望动的那一部分是什么.事实上,没有什么"主体",这是被我们主观划分的,代码中有一部分是不动的,另一部分是动的.而追求永恒(一劳永逸?) ,是我们的天性吧. 我们希望实现一段程序,换一些东西,游戏就由 双截龙 变成了 超级玛丽,再换一点东西,就变成了

C++转换unicode utf-8 gb2312编码

windows开发环境下用VC++6.0 对unicode .utf-8. gb2312 三种编码格式之间的转换方法: [cpp] view plaincopy #include <iostream> #include <string> #include <Windows.h> using namespace std; void unicodeToUTF8(const wstring &src, string& result) { int n = Wid

纯C语言版黄金点游戏

最近花了一段时间自学TCP/IP网络编程技术,掌握了基于TCP的C/S网络通信模型,熟悉了服务器和客户端软件程序的设计流程,并且利用多线程和互斥锁.条件变量等实现了并发机制. 项目介绍 开发环境:Visual Studio 2013运行环境:Windows 7及以上版本网络模型:使用基于TCP的C/S网络通信模型,实现黄金点游戏框架.语言技术:纯C语言开发,支持多线程,采用互斥锁和条件变量完成线程之间的同步和异步. 程序功能 服务器:用户的连接和断开都有相应的提示.一有新用户连接,服务器自动创建

不好意思啊,我上周到今天不到10天时间,用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊

花10天时间用C语言做了个小站 http://tieba.yunxunmi.com/index.html 简称: 云贴吧 不好意思啊.我上周到今天不到10天时间.用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊 估计採集1000万贴,欢迎大家狠狠的来拍吧! 整站大小(网页+C ISAPI类库)不到1MB 容量大.速度快.不管什么贴,随便贴吧,就是量大.容量大.肚量大!

maven-jetty-plugin保存文件报错:请求的操作无法在使用用户映射区域打开的文件上执行

使用jetty-maven-plugin 在eclipse中进行运行调试,碰到无法编辑保存webapp下的文件 提示:请求的操作无法在使用用户映射区域打开的文件上执行 解决方法: 从 jetty 7 开始,jar存放在maven仓库中的路径为org/eclise/jetty/jetty-webapp 打开对应的版本的jar包修改jar中的org/mortbay/jetty/webapp/webdefault.xml文件 Java代码 <init-param> <param-name>

26_Shell语言————if条件判断之文件测试、短路操作符

一.文件测试 文件测试大多都是单目测试,其用法相对简单,其格式为: 操作符:文件路径 可以用来测试的选项有: -f:测试其是否为普通文件,即使用ls -l命令查看时,文件类型显示为 - 的文件: -d:测试其是否为目录文件,即使用ls -l命令查看时,文件类型显示为 d的文件: -e:测试文件是否存在,不论是目录还是文件,如果存在则为真,否则为假: -r:测试文件对当前访问者来说(非创建者)是否可读: -w:测试文件对当前访问者来说(非创建者)是否可写: -x:测试文件对当前访问者来说(非创建者

Java NIO内存映射---上G大文件处理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

powershell-无法加载文件,因为在此系统中禁止执行脚本

写了一个powershell脚本测试脚本,结果执行的时候报错 $a=Get-Content C:\script.txt | select-string -pattern "ora"     if ( $a -eq  $null )     {                 write-host "error"      }     else     {          write-host "OK"      }  PS D:\> .\