1 //char.h2 //头文件3 //结构文件定义,文件信息存储4 //结构初始化函数和其他函数定义
5
6 # ifndef _ h _ char _7# define _ h _ char _
8
9 #包含
10 #包含
11 #包含
12 #包括
13
14 unsigned char BOM[]={0xEF,0xBB,0xBF}; 带//BOM的UTF-8编码文件以这三个字符开头15
16 //File结构的定义
17 typedefstructfile { 18 char * filename; 19字符文件模式; 20字符编码; 21布尔读; 22 )文件; 23
24 //函数定义
25文件*初始化文件(char*,char*; //结构初始化
26boolisutf8(char*; //判断文件是否为UTF-8编码格式
27boolisreadable(char*; 确定filemode是否支持可读选项
28boolcharinstring(char,char *; //判断字符串中是否有字符
29语音打印(file *; //打印结构的内容
30 voidfprintinfo (文件*; //打印结构信息
31 voiddeconstructfile (文件*; //分析结构
32 voidfprintansi (文件*; 33 //以Ansi格式打印变换函数定义
34voidconvert(constchar*strin,char* strOut,int sourceCodepage,inttargetCodepage ); 35voidutf82ansi(pcharsrc,PCHAR Dst ); 36voidansi2utf8(pcharsrc,PCHAR Dst; 37
38 //函数实现
39文件*初始化文件(char * filename,char *filemode ) 40 ) 41文件* file=(file * ) malloc ) sizeof )文件; 42文件-文件名称=文件名称; 43文件-文件模式=文件模式; 44文件编码=' ansi '; 45文件读=假; 46
47if (is utf8 (文件名称) ) 48 (49文件编码=' utf-8 ' ); 50 ) 51
52if (is readable (文件) ) 53 ) 54文件- readable=true; 55 ) 56
57返回文件; (59 ) 59
60boolisutf8(char*filename(61 ) file*FP=fopen ) filename,' r ' ); 63
64if(FP==null ) 65 { 66打印(unabletoopenfile % s (n ),filename ); 67返回假; (69 ) 69
70 unsigned char * buffer=(unsigned char * ) malloc ) sizeof(unsignedchar ) * 3); 71前端(buffer,3,3,fp ); 72fclose(FP; 73
74for(intI=0; i 3; I(75 ) 76if ) buffer[I]!=BOM[I](77 ) 78返回假; 79 80 81
82返回真; 83 ) 84
85boolisreadable(char*filemode ) 86 ) 87if ) charinstring )、filemode )、filemode )、filemode ) 88 )。 90 ) 91返回假; 92 ) 93
94boolcharinstring(charch,char *str ) 95 ) 96while ) str!=‘ ‘) 97{98if(ch==*str ) 99 { 100返回真; 101 ) 102str; 103 ) 104返回假; 105 ) 106
107voidfprintinfo(file*file ) 109printf ) filename : % sn filemode : % s nencoding : % s nreadblead 110
12仅当在12voidfprint(file*file ) 113 ) 114//filemode中包含“r”或“”字符时才可调用fprint函数
115 if (! 文件可读(116 ) 117返回; 118 ) 119
120file*FP=fopen(file-filename,file-filemode ); 121字符; 122
123if(FP==null ) 125打印(failedtoopenfile % s (n ),file-filename ); 126返回; 127 ) 128
129while((chr=fgetc ) FP )!=eof(130 ) 131打印(“% c”,chr ); 132 ) 133
134针(' ); 135fseek(FP,0,SEEK_SET ); //重置为开头
136
137while((chr=fgetc ) FP )!=eof(138 ) 139printf('%x”,) unsigned char (chr ); 140 ) 141打印('nn ' ); 142
143fclose(FP; 144 ) 145
146语音构造文件(文件*文件) 147 ) 148free )文件; 149文件=空; 150 ) 151
152voidfprintansi(file*file ) 153 ) 154if (! 文件读(155 ) 156返回; 157 ) 158 if (文件编码==' ansi ' ) 159 ) 160fprint (文件); 161 ) 162错误
163 { 164 file * FP=fopen (file-filename,file-filemode ); 165
166 int i=0; 167 charch 168 char utf8 [ max _ path ]={0}; 169 char ansi[MAX_PATH]={0}; 170
171 //跳过前三个BOM字符
172fseek(FP,3,SEEK_SET ); 173while((ch=fgetc ) FP )!=eof(174 ) 175UTF8[I]=ch; 176 ) 177UTF8[I]=‘(0‘; 178utf82ansi(utf8,ansi ); 179printf('%sn ',ansi ); 180
181fclose(FP; 182 fp=NULL; 183(184 ) 185
186 //编码格式转换函数
187voidconvert(constchar*strin,char* strOut,int sourceCodepage,inttargetCodepage ) 189intlen=lstrlena ) stri ing 190 191 wchar_t pUnicode[1024]={0}; 192多码页(source code page,0,strIn,- 1,(LPWSTR ) pUnicode,unicodeLen ); 193
194 BYTE pTargetData[2048]={0}; 195 inttargetlen=widechartomultibyte (target code page,0,) LPWSTR ) pUnicode,-1,(char* ) pTargetData,0,NULL,NULL ) LPWSTR ) pUnicode,-1,(char* ) pTargetData,targetLen,NULL,NULL ); 197lstrcpya(strout,) char* ) pTargetData; 198 ) 199voidutf82ansi(PCHARsrc,PCHAR Dst ) 201convert ) src,Dst,CP_UTF8,CP_ACP ); 202 ) 203voidansi2utf8(PCHARsrc,PCHAR Dst ) 205convert ) src,Dst,CP_ACP,CP_UTF8); 206 ) 207
208 #