#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <windows.h>
#include <tchar.h>
#define MAX_PHRASE_LEN 8
#define MAX_PY_NUM 420
#define MAX_EACH_PY_NUM 41typedef struct {
WORD wKey;
TCHAR szPY[8];
} PINYIN,FAR *LPPINYIN;PINYIN      aPYTab[26][MAX_EACH_PY_NUM] = {0};void LoadHZDictionary( LPCTSTR lpStr)
{//执行一次得到freepy.tab中一行的拼音和给该拼音分配一个键值
TCHAR szPY[20],szHZ[1000];
static int i=0,j=0,nPre=0;
WORD wPYHead=1;
LPPINYIN lpPYTab = (LPPINYIN)aPYTab; _stscanf(lpStr,"%s %s",szPY,szHZ); wPYHead=(WORD)szPY[0] - (WORD)_T('a');
if(wPYHead != nPre) j=0;
_tcscpy( (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->szPY,szPY);
(lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->wKey=i+1; nPre=wPYHead;
i++,j++;
return;
}WORD GetSegment(LPTSTR buf)
{
if(*buf == _T('\0')) return 1; //END_SEGMENT
else if(*buf == _T('#')) return 2; //COMMENT
else if( _tcsstr(buf,_T("[PUNCTUATION]")) != NULL ) return 3; 
else if( _tcsstr(buf,_T("[DICTIONARY]")) != NULL) return 4;
else return 0;
}void GetStr(FILE *pf,LPTSTR pbuf)
{//每执行一次读入一行
while( !feof(pf) ) {
*pbuf = _fgettc(pf);
if(*pbuf == _T('\n')) break;
pbuf++;
}
*pbuf = _T('\0');
}void LoadTable()
{//将freepy.tab中所有的拼音存到了全局数组aPYTab中
FILE *stream;
TCHAR szStr[1000];
TCHAR szTabFileName[200];
LPTSTR lpTabFileName = szTabFileName;
lpTabFileName += GetSystemDirectory(szTabFileName,200);
if (*(lpTabFileName-1) != _T('\\'))
*lpTabFileName++ = _T('\\');
_tcscpy(lpTabFileName,_T("freepy.tab")); if( (stream = _tfopen( szTabFileName, "r" )) == NULL ){
_stprintf(szStr,"%s can not found",szTabFileName);
MessageBox(NULL,szStr,"init",MB_OK);
exit(1);
}

while( !feof( stream )) {
GetStr(stream,szStr); switch( GetSegment(szStr)) {
case 1: //END_SEGMENT
break; case 2: //COMMENT
break; case 3: //PUNCTUATION
if( feof( stream ) ) goto my_exit;
GetStr(stream,szStr);
while(GetSegment(szStr) != 1) {
if( GetSegment(szStr) != 2){
//LoadPunct( szStr );
}
if( feof( stream ) ) goto my_exit;
GetStr(stream,szStr);
}
break; case 4: //DICTIONARY
if( feof( stream ) ) goto my_exit;
GetStr(stream,szStr);
while(GetSegment(szStr) != 1) {
if( GetSegment(szStr) != 2){
LoadHZDictionary( szStr );
}
if( feof( stream ) ) goto my_exit;
GetStr(stream,szStr);
}
break; default:
break;
}
}
my_exit:
fclose(stream);
return;
}WORD String2Array(LPTSTR lpBuf,LPTSTR lpStrArr,WORD wMaxArrSize)
{//将freepy.tab中每一行的汉字写入lpStrArr
int i;
WORD cursor=0,count=0,wBufLen;

wBufLen = strlen(lpBuf);

for (i=0;i<wBufLen;i++){
if(*(lpBuf+i) == _T(' ') || *(lpBuf+i) == _T('\t')) {
if(i!=0 && *(lpBuf+i-1)!=_T(' ') && *(lpBuf+i-1)!=_T('\t') ){
_tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor);
*(lpStrArr+count*wMaxArrSize+i-cursor)=_T('\0');
count++;
}
cursor=i+1;
}
if(i == wBufLen-1 && *(lpBuf+i)!=_T(' ') && *(lpBuf+i)!=_T(' ') ){
_tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor+1);
*(lpStrArr+count*wMaxArrSize+i-cursor+1)=_T('\0');
count++;
}
}
return count;
}int sim2lib(LPTSTR lpInName,LPTSTR lpOutName)
{
FILE *stream,*out;
int i,j;
TCHAR szStr[250];
WORD wLen,wHead,flag;
BYTE abKey[MAX_PHRASE_LEN+2],bLen;
WORD awKey[MAX_PHRASE_LEN];
WORD wCount;
TCHAR szStrArr[MAX_PHRASE_LEN+4][2*MAX_PHRASE_LEN+2];
WORD wAttrib; wAttrib=0;

if( (stream = _tfopen( lpInName, _T("r") )) == NULL ){
fprintf(stderr,"%s cant open.\n",lpInName);
exit(1);
}

if( (out = _tfopen( lpOutName, _T("wb") )) == NULL ){
fprintf(stderr,"%s cant open.\n",lpOutName);
exit(1);
} while( !feof( stream )) {
if( _fgetts(szStr,1000,stream) != NULL){
*(szStr+_tcslen(szStr)-1)=_T('\0');
wCount=String2Array(szStr,(LPTSTR)szStrArr,2*MAX_PHRASE_LEN+2);
wLen=_tcslen(szStrArr[0])/2;
if(wLen != wCount-1 || wLen > MAX_PHRASE_LEN){
printf("%s\n",szStr);
continue;
}
for(i=1;i<wCount;i++){
wHead=(int)szStrArr[i][0] - _T('a');
flag=1;
if(wHead < 0 || wHead > 25){
printf("%s\n",szStr);
flag=0;
break;
}
flag=0;
for(j=0;aPYTab[wHead][j].wKey;j++){
if(!_tcscmp(aPYTab[wHead][j].szPY,szStrArr[i])){
awKey[i-1]=aPYTab[wHead][j].wKey;
flag=1;
break;
}
}
if(!flag) break;
}
if(!flag){
printf("%s\n",szStr);
continue;
}
for(i=0;i<wLen;i++)
abKey[i+1] = awKey[i] & 0xff;

abKey[0]=_T('\0');
for(i=0;i<wLen;i++)
abKey[0] |= (awKey[i] & 0x0100) >> (8-i);

bLen=(BYTE)wLen;

fwrite(&bLen,1,1,out);
fwrite(abKey,1,wLen+1,out);
fwrite(szStr,1,wLen*2,out);
fwrite(&wAttrib,2,1,out);
}
}

fclose(stream);
fclose(out);
return (0);
}void main(int argc,char **argv)
{
  if(argc != 3) {
    fprintf(stderr,"usage: %s <input_name> <output_name>\n",argv[0]);
    return;
  }
  LoadTable();
  sim2lib(argv[1],argv[2]);
  return;
}这是自由拼音输入法中一个将.txt文件转化为.dic文件的源程序。当.txt文件是ANSI格式时不会有问题。但我想让程序处理unicode格式的.txt文件。将工程属性的预处理设为了_UNICODE,UNICODE。编译时出现以下错误:
:\vcproject\sim2lib1\sim2lib.c(30) : warning C4133: 'function' : incompatible types - from 'char [6]' to 'const unsigned short *'
d:\vcproject\sim2lib1\sim2lib.c(74) : warning C4133: 'function' : incompatible types - from 'char [2]' to 'const unsigned short *'
d:\vcproject\sim2lib1\sim2lib.c(75) : warning C4133: 'function' : incompatible types - from 'char [17]' to 'const unsigned short *'
d:\vcproject\sim2lib1\sim2lib.c(76) : warning C4133: 'function' : incompatible types - from 'char [5]' to 'const unsigned short *'
d:\vcproject\sim2lib1\sim2lib.c(128) : warning C4133: 'function' : incompatible types - from 'unsigned short *' to 'const char *'
d:\vcproject\sim2lib1\sim2lib.c(231) : warning C4133: 'function' : incompatible types - from 'char *' to 'unsigned short *'
d:\vcproject\sim2lib1\sim2lib.c(231) : warning C4133: 'function' : incompatible types - from 'char *' to 'unsigned short *'
这是咋回事啊?还有,对于非MFC的vc程序如果想处理unicode需要把程序入口点设为wWinMainCRTStartup吗。我试了一下结果出现编译错误:LIBCD.lib(wwincrt0.obj) : error LNK2001: unresolved external symbol _wWinMain@16
Debug/sim2lib1.exe : fatal error LNK1120: 1 unresolved externals困惑极了!!哪位大哥帮助一下!多谢!!

解决方案 »

  1.   

    1.前提条件:
       运行VC++的安装程序,选中MFC的UNICODE支持。
    2。VC++Build- >configurations...- >Add- >Configuration- >"Unicode Debug"- >O
    K
    3.Project- >Setting- >C++- >Preprosesser Definitions- >加入UNICODE,_UNICODE
    , 去掉MBCS即可
    4。Project- >Setting- >lINK- >Category- >)Outputw- >加入wWinMainCRTStartup。5选择"Win32 Unicode debug"编译方式,代码按照Unicode encoding! 我按照这个步骤设置后,同样会产生上面的错误。对不起,有个小错误。void LoadHZDictionary( LPCTSTR lpStr)参数是LPTSTR
      

  2.   

    (重发楼上的)1.project下面选setting,然后选C/C++,在preprocessor definitions中加入 
    _UNICODE.(不需要去掉_MBCS) 
      

  3.   

    LIBCD.lib(wwincrt0.obj) : error LNK2001: unresolved external symbol _wWinMain@16 
    Debug/sim2lib1.exe : fatal error LNK1120: 1 unresolved externals 没解决的外部连接(符号)LIBCD.lib(wwincrt0.obj) 这个有问题?重新下载吧(版本问题有可能)?或许真是设置问题
      

  4.   

        * shinefen
        * 星'闪 [最大的字段长度是未知ߥ]
        * 等 级:
    发表于:2007-10-12 12:07:484楼 得分:0
    LIBCD.lib(wwincrt0.obj) : error LNK2001: unresolved external symbol _wWinMain@16 
    Debug/sim2lib1.exe : fatal error LNK1120: 1 unresolved externals 没解决的外部连接(符号)LIBCD.lib(wwincrt0.obj) 这个有问题?重新下载吧(版本问题有可能)?或许真是设置问题
    是不是说Win32程序(非MFC)入口点也得设为wWinMainCRTStartup?我在网上查资料只说MFC程序得这样设置,我这个程序是win32控制台应用程序。
      

  5.   

    ...如果说~说Win32程序(非MFC)入口点也得设为wWinMainCRTStartup之后就连接错误如上;
    那么你有没有试过Win32程序(非MFC)用"多字符集"而不用"unicode" ..试一试也好
      

  6.   

    问题解决了,用了一个函数MultiByteToWideChar,现在该程序对于unicode和非unicode文件都可以处理~~
    谢谢
      

  7.   

    我正在学习这个程序,想把它处理成支持unicode的。所以目前就用的这个程序