һ

      ֧ɶַǵȿʾֿ⣨ʸֿתֿ)塢ͬСĵֿ⣬ҪӦҪʾֿ֧֣ǶʽϵͳС
      ص㣺 תٶȷǳ죨뼶,עᣬ֧ 16 ֿת



     1.֧ windows ַ£

	CP932,    Shift-JIS 磺
	CP936,    GBK   磺(л񹲺͹), (ر), (¼)
	CP949,    ģ          磺    
	CP950,    Big5  磻(̨), (ر)
	CP874,    ̩ģ          磺̩
	CP1250,   ŷ          磺ݿ,,,,޵,˹工,,˹,ά()
	CP1251,   ģ      磺,,ڿ,ʱ,(FYROM),,˹,,ɹ,ݽ,ȱ,ά
	CP1252,   ŷ(I) 磺̩¡,,,Ӣ,,,,,,,Ų,,ӡ,ʿ,Ϸ,,,˹ϣ,,
	CP1253,   ϣģ 			  磺ϣ  
	CP1254,   ģ      磺,ݽ,ȱ
	CP1255,   ϣģ      磺ϣ  
	CP1256,   ģ      磺ڶ,˹,(,,,,Ħ,ͻ˹,,Ҳ,,Լ,,,,,)
	CP1257,   ޵ĺģ    磺ɳ,ά,
	CP1258,   Խϣ          磺Խ
	unicode   ַɺϳɡ

     2. ֧ BIN(*.bin), TXT(*.txt), BMP(*.bmp) ļ

      A. BIN ļɣ洢ҪõĵֿϢļṹĴ󲿷ɣļͷϢϢ

	     1). ļͷָļǰʮֽڣBYTE),Ϣ½ṹ

	  typedef struct tagFontLibHeader{
			BYTE	magic[4];	//'U'(or M), 'F', 'L', X---Unicode(or MBCS) Font Library, X: ʾ汾. ָߵ4λ 0x12ʾ Ver 1.2
			DWORD Size;			/* File total size */
			BYTE	nSection; // ּݣҪ UNICODE Ч 
			BYTE	YSize;    /* height of font  */  			
			WORD	wCpFlag;    // codepageflag:  bit0~bit13 ÿbitֱһCodePage ־1ʾǰCodePage ѡΪѡ
			char	reserved[4];	  // Ԥֽ	
		} FL_Header;
			
	     2). Ϣֻ UNICODE ЧռֽnSection*sizeof(FL_SECTION_INF)ṹ£

		typedef struct tagFlSectionInfo{
			WORD  First;         /* first character               */
			WORD  Last;          /* last character                */
			DWORD OffAddr;      /* ָǵǰSECTION UFL_CHAR_INFOһַϢʼַ */
		} FL_SECTION_INF, *PFL_SECTION_INF;
				
			
	     3). ֻԷǵȿMBCSССġģЩȿ UNICODE ֿЧ

		typedef struct tagUflCharInfo{
			#ifdef	SUPPORT_MAX_FONT        // ôṹ֧248
				DWORD	 OffAddr;      // ǰַݵʼַ
				BYTE	 Width;       // ַصĿ
			#else
				DWORD	 OffAddr	: 26;      // ǰַݵʼַ
				DWORD	 Width	: 6;       // ַصĿ( Ŀǰ֧ 56 
			#endif
		} UFL_CHAR_INDEX;

		ǷǵȿMBCSֿ⣬ռֽΪ0xff * sizeofUFL_CHAR_INDEX
		Unicodeֿ⣬ռֽΪ((xxx[0].Last - xxx[0].First + 1)+...+(xxx[nSection-1].Last - xxx[nSection-1].First + 1)) * sizeofUFL_CHAR_INDEX;
				
	     4). ϢǰаַַĵϢϡݴ洢ʽΪߵλ洢磺 10110011 00011010 Ϊ B3. 1A
			 
	     
           磺ʾ code = xxxx ַΪֱ£
				 
		    (1). ǵȿMBCSֿ
		            a. ȶFL_HeaderϢ
		            b. sizeofFL_Header + code * 2ҵcode UFL_CHAR_INDEXϢ
		            c. UFL_CHAR_INDEXOffAddrҵǰcodeĵϢ
		            d. FL_Header.YsizeUFL_CHAR_INDEX.WidthԼϢshowǰַ
		    (2). ȿ MBCSֿ ССġģ
		            a. ȶFL_HeaderϢ
       		      b. codeڵǰַеֵindexȻsizeofFL_Header + index * (FL_Header.Ysize/8*FL_Header.Ysize)ҵcodeĵϢ
       		      c. ȻFL_Header.YsizeϢshowǰַ
			       			
			  ǰcode㵱ǰַcodepageλ,ֵ˺ҪMBCSеļУУģģ
			  static long GetPosWithMbcs(UINT code, UINT codepage)
			  {
				long lIdx = -1;
							
				BYTE R = (code >> 8) & 0xFF;   //
				BYTE C = code & 0xFF;   //λ
									
				switch(codepage)
				{
				case CP932:    // 
					if(R >= 0x81 && R <= 0x9F)
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = (R-0x81)*187 + (C-0x40);  //187 = (0x7E-0x40+1)+(0xFC-0x80+1); 			
						else if(C >= 0x80 && C <= 0xFC)
							lIdx = (R-0x81)*187 + (C-0x80)+62;  // 62 = 0x7E-0x40+1;			
					}
					else if(R >= 0xE0 && R <= 0xFC)
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = 5797 + (R-0xE0)*187 + (C-0x40);  // 5797 = 187 * (0x9F-0x81+1);
						else if(C >= 0x80 && C <= 0xFC)
							lIdx = 5797 + (R-0xE0)*187 + (C-0x80)+62;
					}
					break;
									
				case CP936:       // 
					if((R >= 0xA1 && R <= 0xFE) && (C >= 0xA1 && C <= 0xFE))
						lIdx = (R-0xa1)*94 + (C-0xa1);  //94 = (0xFE-0xA1+1); 
					break;
									
				case CP949:       // 
					if(R >= 0x81)
					{
						if(C >= 0x41 && C <= 0x7E)
							lIdx = ((R-0x81) * 188 + (C - 0x41));   // 188 = (0x7E-0x41+1)+(0xFE-0x81+1);
						else if(C >= 0x81 && C <= 0xFE)
							lIdx = ((R-0x81) * 188 + (C - 0x81) + 62);  // 62 = (0x7E-0x41+1);
					}
					break;
									
				case CP950:        // 
					if(R >= 0xA1 && R <= 0xFE) 
					{
						if(C >= 0x40 && C <= 0x7E)
							lIdx = ((R-0xa1)*157+(C-0x40));   // 157 = (0x7E-0x40+1)+(0xFE-0xA1+1);
						else if(C >= 0xA1 && C <= 0xFE)
							lIdx = ((R-0xa1)*157+(C-0xa1)+63);  // 63 = (0x7E-0x40+1);
					}
					break;
				default:
					break;
				}
				return lIdx;
			}
			       			
		    (3). Unicodeֿ ԰ַ
		         a. ȶFL_HeaderϢ
		         b. ǰַڵڼ,ڵnΣͿɸxxx[n].OffAddr+code - xxx[n].First* sizeofUFL_CHAR_INDEXҵַϢ(UFL_CHAR_INDEX)
		         c. UFL_CHAR_INDEXOffAddrҵǰcodeĵϢ
	           d. FL_Header.YsizeUFL_CHAR_INDEX.WidthԼϢshowǰַ
			       			
			
	    B. TXT ļѡɣ 洢ǵǰַֿģʾЧת

	    C. BMP ļѡɣ ǽǰַֿϢϳɵһλͼļֻ MBCS Чת

	   3. ֧Ԥ
	      Դһɵֿļ*.binȻֿıͣMBCS  UNICODE)goto codeı༭Ӧı룬ɿǰַʾЧ֪ʾȡ
	      ԤУɷŴСǰַʾЧ	 
			 
ʹ˵
	   1. תֿ⣬£
	      1). ѡһҪתʸļ(*.ttf)Ƚc:\windows\fonts Ŀ¼µļ,Ȼѡ񣬽ȥһArialUni.ttfֿ⣬Ŀǰܶlinuxϵͳõľǳȫ)
	      2). ѡ(MBCS or Unicode)
	      3). ѡСĿǰֻ֧162432404856ɸĳɴ  > 56 
	      4). ѡҪתַ(ֶ֧ѡ)磺Ҫõģѡģͬʱѡ
	      5). ѡļ(BIN ļʼĬѡ
	      6). ѡĿ¼ɵļŵѡĿ¼С
	      7).  build ťԵƬ̣Ҫֿļ

	      ע⣺ ѡMBCS 뷽ʽѡַļ
	             ѡNICODE뷽ʽѡٸַֻһļ
	             
	             ֿʧܣпѡļ(*.TTF)ԭͲַַϢ 磺вںַɵֿ޷ֺ֧ʾ
	             ο취 ϵͳԴַӳͿѡͬ壬ַ򿪡߼鿴вա
	             ַӳķ
	             1. ֱӼ "charmap"ʽп
	             2. -->-->ϵͳ--->ַӳ
	    
	   2. ֿԤ£
	      1). ѡһҪԤֿļ*.binԶ򿪷ͣСַ
	      2).  goto codeı༭УҪ鿴ַı(ǰѡֿ*.BIN unicode룬unicode룬mbcs 룩س󼴿ɿʾЧɵַ֪ʵʾȡ
	 
	          ⣬֧Ԥ ϶ԷŴСԤЧ
	        
	   3. ע  

	      ûע£ֻ֧16ֿתע֧2432404856 ɸҪ޸ĵָ֧塣

	      ע᷽  "Aoubt..." ťᵯһԻٵ "ע..." ťʾɡ	 		



	Ըܸһʣв׵ĵطԸҷʼл
		
	==================================================================================
            
				  ܰɹ

			    MAIL: 9599598@qq.com; wujianguo789@126.com

			    MSN: wujianguo19@hotmail.com
			    










