FOX 已经停止更新五笔、智拼和笔画词库了,下面给出词库的解码程序。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iconv.h>
using namespace std;
#define CODE_LENGTH 8
#define WORD_LENGTH 4
typedef struct sDictRecord{
char incode[CODE_LENGTH];
char words[WORD_LENGTH];
} DicRec;
void DicRec_print(DicRec *rec,iconv_t cvt,FILE *fTxt){
if(cvt==(iconv_t)-1){
printf("failed to initialize converter.");
exit(3);
}
char ic[CODE_LENGTH+1]={'\0'};
char w[WORD_LENGTH+1]={'\0'};
const char *pin=(const char *)rec->words;
char *pout=(char *)w;
memcpy(ic,rec->incode,CODE_LENGTH);
size_t
in_left = strlen( rec->words ),
out_left = WORD_LENGTH + 1;
w[WORD_LENGTH]='\0';
iconv(cvt,
&pin, &in_left,
&pout, &out_left);
printf("%s - %s\n",ic,w);
fprintf(fTxt,"%s,%s\n",ic,w);
}
int main()
{
DicRec record;
size_t rsize=sizeof(DicRec);
int err;
iconv_t cvt=iconv_open("GBK","UTF-16LE");
FILE *fDat=fopen("wb.dat","rb");
FILE *fTxt=fopen("wb.txt","wt");
if(fDat==NULL || fTxt==NULL){
printf("failed to open the file.");
exit(1);
}
printf("size of record: %u\n", rsize);
while(fread(&record,rsize,1,fDat)>0){
DicRec_print(&record,cvt,fTxt);
}
printf("\n");
fclose(fTxt);
fclose(fDat);
iconv_close(cvt);
return 0;
}