#include <stdlib.h> #include <string.h> #include <iconv.h> #include <stdio.h> #define hz_offset(hz) (((hz[0] - 0xa1) * 94 + (hz[1] - 0xa1)) * 32) /* 字符串转码 */int decoding(char* from_charset, char* to_charset, char* inbuf, int inlen, char* outbuf, int outlen) { iconv_t cd; char** pin = &inbuf; char** pout = &outbuf; if((cd = iconv_open(to_charset, from_charset)) == (iconv_t)0) { return -1; } memset(outbuf, 0, outlen); if(iconv(cd, pin, &inlen, pout, &outlen) == -1) { iconv_close(cd); return -1; } iconv_close(cd); return 0; } /* 汉字从UTF-8转为GB2312编码 */int hz_decoding(char* hz_utf8, char* hz_gb2312) { return decoding("utf-8", "gb2312", hz_utf8, 3, hz_gb2312, 3); } /* 打印汉字 */void hz_show(unsigned char* datas) { int i; int j; int k; unsigned char ch; for(i = 0; i < 16; i++) { for(j = 0; j < 2; j++) { ch = datas[i * 2 + j]; for(k = 0; k < 8; k++) { if(ch & 0x80) { printf("%c ", '*'); } else { printf(" "); } ch <<= 1; } } printf("\n"); } } int main(int argc, char* argv[]) { FILE* hzk; unsigned char hz_utf8[3] = "宋"; unsigned char hz_gb2312[3]; unsigned char hz_datas[32]; hz_decoding(hz_utf8, hz_gb2312); printf("%x, %x\n", hz_gb2312[0], hz_gb2312[1]); if((hzk = fopen("simhei_gb2312_16.ds", "rb")) == NULL) { return -1; } fseek(hzk, hz_offset(hz_gb2312), SEEK_SET); fread(hz_datas, 32, 1, hzk); hz_show(hz_datas); fclose(hzk); return 0; }
上一页 [1] [2]