⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convertcode.cpp

📁 对于通用的嵌入式系统字处理单元,本模块化程序可以快速实现常用汉字编码(GB2312,GB18030,BIG5码,Unicode码)的相互转换,无需库函数.从而实现使用单汉字字库显现多内码.具体参见re
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* convertCode.cpp : Defines the entry point for the console application. */

/***************************************************************************
* Copyright (c) 2008, CZ
* All rights reserved.
* 
* 文件名称:convertCode.c
* 文件标识:
* 摘    要:汉字内码转换处理函数
* 			@main()
*			@Utf16TOGb18030()
*			@Utf8TOGb18030()    
*			@Big5TOGb18030()
*			@Utf16TOBig5()
*			@Utf8TOBig5()
*			@Gb18030TOBig5()
*			@SearchCodeTable()

* 当前版本:1.0
* 作    者:CZ
* 完成日期: 
*
* 修改与优化处理:
**************************************************************************/

#include "stdafx.h"

/*********************************************************
文件内部使用的宏
均为编码转换开关,
命名规则: _源码类型_目标嘛类型,其中GB表示GB18030码,LE表示LittleEndian,BE表示BigEndian,如_GB_BIG5表示将GB18030编码转换为BIG5码
取值规则: 需要相应编码转换时将对应的宏定义为1,反之为0
*****************************************************/
#define _UTF16BE_GB		1
#define _UTF16LE_GB		1
#define _UTF8_GB		1
#define _BIG5_GB		1

#define _UTF16BE_BIG5	1
#define _UTF16LE_BIG5	1
#define _UTF8_BIG5		1
#define _GB_BIG5		1

#if (_UTF16LE_GB || _UTF16BE_GB || _UTF8_GB)
#include ".\tools1\UTF16_GB_2B_H.h"
#include ".\tools1\UTF16_GB_4B_H.h"
#endif

#if (_BIG5_GB)
#include ".\tools2\BIG5_GB_2B_H.h"
#endif

#if (_UTF16LE_BIG5 || _UTF16BE_BIG5 || _UTF8_BIG5)
#include ".\TB_X2BIG5\UTF16_BIG5_2B_H.h"
#endif

#if (_GB_BIG5)
#include ".\TB_X2BIG5\GB_BIG5_2B_H.h"
#endif

U16 SearchCodeTable(U16 unicodeKey);
S8 Utf16TOGb18030(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen);
S8 Utf8TOGb18030(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen);
S8 Big5TOGb18030(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen);
S8 Utf16TOBig5(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen);
S8 Utf8TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen);
S8 Gb18030TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen);

/**********************************************************************
* 函数名称:main
* 功能描述: 
*			 改函数为带命令参数的命令convertCode.exe的主函数
*			 将根据输入的命令参数,转换一定编码的文件到另外一个编码文件
*
* 命令格式: convertCode 转换类型 输入文件 输出文件 
*			(如:convertCode UTF16_GB utftxt gbtxt)
*			  其中的转换类型有:(格式为 源编码_目标编码)
*					UTF16BE_GB		
*					UTF16LE_GB		
*					UTF8_GB		
*					BIG5_GB		
*					UTF16BE_BIG5	
*					UTF16LE_BIG5	
*					UTF8_BIG5		
*					GB_BIG5		
*
* 接口描述
*   输入参数: 
* 					argc  此值需为4,否则回显提示信息
* 					arg[],具体见命令格式
*				
*   返回参数: 0--转换成功  非0--转换出错
* 影响的参数:无
* 补充说明:  无	
***********************************************************************/
int main(int argc, char* argv[])
{
	FILE * pfIn, * pfOut;
	U16	 u16Indata;
	U8  outputCode[8],inputCode[4];
	U8 u8OutputLen,i,u8InputLen;


 
#if 0
/* 调试用,优先编译最上面的  */
  argc = 4;   
  argv[1] = "UTF16_GB";   
  argv[2] = "Unicode.TXT";
  argv[3] = "b_.txt"; 
/*
#endif
#if 0
*/
#if (_UTF8_BIG5)
  argc = 4;   
  argv[1] = "UTF8_BIG5";   
  argv[2] = "U8.HTM";
  argv[3] = "B5_O3.HTM"; 
#elif (_UTF16BE_BIG5)
  argc = 4;   
  argv[1] = "UTF16BE_BIG5";   
  argv[2] = "UB.HTM";
  argv[3] = "B5_O2.HTM"; 
#elif (_UTF16LE_BIG5)
  argc = 4;   
  argv[1] = "UTF16_BIG5";   
  argv[2] = "UL.HTM";
  argv[3] = "B5_O1.HTM"; 
#elif (_GB_BIG5)
  argc = 4;   
  argv[1] = "GB_BIG5";   
  argv[2] = "GB_O.htm";
  argv[3] = "B5_O.htm"; 
#elif (_BIG5_GB)
  argc = 4;   
  argv[1] = "BIG5_GB";   
  argv[2] = "B5.htm";   
  argv[3] = "GB_O.htm";   
#elif (_UTF8_GB)  
  argc = 4;   
  argv[1] = "UTF8_GB";   
  argv[2] = "U8TEST.txt";   
  argv[3] = "GB.TXT";   
#elif (_UTF16BE_GB)    
  argc = 4;   
  argv[1] = "UTF16BE_GB";   
  argv[2] = "U16TESTB.txt";   
  argv[3] = "GB.TXT";   
#elif  (_UTF16LE_GB) 
  argc = 4;   
  argv[1] = "UTF16_GB";   
  argv[2] = "Unicode.TXT";   
  argv[3] = "GB_.TXT";   
#endif
#endif
  
	if(argc != 4)/*  if(0)!! */
	{
		printf("命令格式: convertCode 命令(UTF16_GB/UTF16BE_GB/UTF8_GB/BIG5_GB/GB_BIG5/UTF16_BIG5/UTF8_BIG5) XXX(输入文件名) YYY(输出文件名)\n");
		return 1;
	}
#if (_UTF16LE_GB)
	if (strcmp(argv[1],"UTF16_GB") == 0) /* !! if (1)*/
	{
	  if (((pfIn = fopen(argv[2],"rb"))!= NULL)&& ((pfOut = fopen(argv[3],"wb"))!=NULL))
	  //if (((pfIn = fopen("U16TEST.txt","rb"))!= NULL)&& ((pfOut = fopen("GB.TXT","wb"))!=NULL))
	  {
		 inputCode[0] = fgetc(pfIn);
		 inputCode[1] = fgetc(pfIn);
		 if ((inputCode[0] != 0xff)||(inputCode[1] != 0xfE))
		 {
	 		 if ((inputCode[0] == 0xfe)&&(inputCode[1] == 0xff))
			 {
				 printf("输入文件为BigEndian格式,请使用UTF16BE_GB标识转换\n");
				 return 2;
			 }
			 else
			 {
				printf("警告:输入文件没有BOM标识\n");
				/* 默认按照Little Endian */
				fseek( pfIn, 0, SEEK_SET); /* 文件指针回到文件头 */
			 }
		 }
		 
		 /* 从输入文件读入UTF16数据,转换为GB18030格式后写入输出文件 */
		 while (!feof(pfIn))
		 {/* 输入文件未结束 */
		  /* 从输入文件读入UTF16数据 */
		  inputCode[0] = fgetc(pfIn);
		  inputCode[1] = fgetc(pfIn);
		  u16Indata =inputCode[0] + (inputCode[1]<<8);
		  if( ferror( pfIn ) )
		  {
			printf( "\nRead error" );
			break;
		  }
#if 1
if (u16Indata == 0x2e81)
{
argc++;
}
#endif
		  /* 转换为GB18030格式后写入输出文件 */
		  Utf16TOGb18030(&u16Indata, outputCode, &u8OutputLen);
		  for (i = 0; i < u8OutputLen; i++)
		  {
			fputc(outputCode[i],pfOut);
		  }
		 }
		fclose(pfIn);
		fclose(pfOut);
		return 0;

		}
	  else
	  {
		printf("输入%s(%X)或输出文件%s(%X)不存在\n",argv[2],(S32)pfIn,argv[3],(S32)pfOut);
		return 3;
	  }
	} 
#endif	

#if (_UTF16BE_GB)
	if(strcmp(argv[1],"UTF16BE_GB") == 0)
	{
	  if (((pfIn = fopen(argv[2],"rb"))!= NULL)&& ((pfOut = fopen(argv[3],"wb"))!=NULL))
 	  {
		 inputCode[0] = fgetc(pfIn);
		 inputCode[1] = fgetc(pfIn);
		 if ((inputCode[0] != 0xfe)||(inputCode[1] != 0xff))
		 {
	 		 if ((inputCode[0] == 0xff)&&(inputCode[1] == 0xfe))
			 {
				 printf("输入文件为LittleEndian格式,请使用UTF16_GB标识转换\n");
				 return 4;
			 }
			 else
			 {
				printf("警告:输入文件没有BOM标识\n");
				/* 默认按照BIG Endian */
				fseek( pfIn, 0, SEEK_SET); /* 指针回到文件头 */
			 }
		 }
		 
		 /* 从输入文件读入UTF16数据,转换为GB18030格式后写入输出文件 */
		 while (!feof(pfIn))
		 {/* 输入文件未结束 */
		  /* 从输入文件读入UTF16数据 */
		  inputCode[0] = fgetc(pfIn);
		  inputCode[1] = fgetc(pfIn);
		  u16Indata =inputCode[1] + (inputCode[0]<<8);
		  if( ferror( pfIn ) )
		  {
			printf( "\nRead error" );
			break;
		  }
		  
		  /* 转换为GB18030格式后写入输出文件 */
		  Utf16TOGb18030(&u16Indata, outputCode, &u8OutputLen);
		  for (i = 0; i < u8OutputLen; i++)
		  {
			fputc(outputCode[i],pfOut);
		  }
		 }
		fclose(pfIn);
		fclose(pfOut);
		return 0;

		}
	  else
	  {
		printf("输入%s(%X)或输出文件%s(%X)不存在\n",argv[2],(S32)pfIn,argv[3],(S32)pfOut);
		return 5;
	  }
		
	}		
#endif

#if (_UTF8_GB)
	if(strcmp(argv[1],"UTF8_GB") == 0)
	{
	  if (((pfIn = fopen(argv[2],"rb"))!= NULL)&& ((pfOut = fopen(argv[3],"wb"))!=NULL))
 	  {
		 inputCode[0] = fgetc(pfIn);
		 inputCode[1] = fgetc(pfIn);
		 inputCode[2] = fgetc(pfIn);

		 if ((inputCode[0] != 0xef)||(inputCode[1] != 0xbb)||(inputCode[2] != 0xbf))
		 {
			printf("警告:输入文件没有BOM标识\n");
				/* 默认按照UTF8 */
			fseek( pfIn, 0, SEEK_SET); /* 指针回到文件头 */
		 }
		 
		 /* 从输入文件读入UTF8数据,转换为GB18030格式后写入输出文件 */
		 while (!feof(pfIn))
		 {/* 输入文件未结束 */
		  /* 从输入文件读入UTF8数据 */
		  inputCode[0] = fgetc(pfIn);
		  u8InputLen  = 1 ;

		  if (inputCode[0] > 0x80 )
		  {
			i = 0x40;
			while (i & inputCode[0])
			{
				u8InputLen++;
				i = (i >> 1);
			}
		  } 
		  
		  if( u8InputLen > 3 )
		  {
			if (!feof(pfIn))
			{
				printf( "\n不支持格式的输入文件" );
			}
			break;
		  }
		  
		  for( i = 1; i < u8InputLen ; i++)
		  {
		  	inputCode[i] =  fgetc(pfIn);
		  }	

		  if( ferror( pfIn ) )
		  {
			printf( "\n输入文件未知错误" );
			break;
		  }
		  /* 转换为GB18030格式后写入输出文件 */
		  Utf8TOGb18030(inputCode, u8InputLen, outputCode, &u8OutputLen);
		  for (i = 0; i < u8OutputLen; i++)
		  {
			fputc(outputCode[i],pfOut);
		  }
		 }
		fclose(pfIn);
		fclose(pfOut);
		return 0;

		}
	  else
	  {
		printf("输入%s(%X)或输出文件%s(%X)不存在\n",argv[2],(S32)pfIn,argv[3],(S32)pfOut);
		return 5;
	  }
		
	}		
#endif

#if (_BIG5_GB)
	if(strcmp(argv[1],"BIG5_GB") == 0)
	{
	  if (((pfIn = fopen(argv[2],"rb"))!= NULL)&& ((pfOut = fopen(argv[3],"wb"))!=NULL))
 	  {

		 /* 从输入文件读入BIG5数据,转换为GB18030格式后写入输出文件 */
		 while (!feof(pfIn))
		 {/* 输入文件未结束 */
		  /* 从输入文件读入BIG5数据 */
		  u8InputLen = 1;
		  if ((inputCode[0] = fgetc(pfIn)) >= 0x81)
		  {	/* 为双字节汉字 */
		  	inputCode[1] = fgetc(pfIn)	;
		  	u8InputLen = 2;
		  }		

		  /* 转换为GB18030格式后写入输出文件 */
		  Big5TOGb18030(inputCode, u8InputLen, outputCode, &u8OutputLen);
		  for (i = 0; i < u8OutputLen; i++)
		  {
			fputc(outputCode[i],pfOut);
		  }
		 }
		fclose(pfIn);
		fclose(pfOut);
		return 0;

		}
	  else
	  {
		printf("输入%s(%X)或输出文件%s(%X)不存在\n",argv[2],(S32)pfIn,argv[3],(S32)pfOut);
		return 5;
	  }
		
	}		
#endif

/* ============   以下是转换到BIG5码的部分 ==================*/

#if (_UTF16LE_BIG5)
	if (strcmp(argv[1],"UTF16_BIG5") == 0) 
	{
	  if (((pfIn = fopen(argv[2],"rb"))!= NULL)&& ((pfOut = fopen(argv[3],"wb"))!=NULL))
	  {
		 inputCode[0] = fgetc(pfIn);
		 inputCode[1] = fgetc(pfIn);
		 if ((inputCode[0] != 0xff)||(inputCode[1] != 0xfE))
		 {
	 		 if ((inputCode[0] == 0xfe)&&(inputCode[1] == 0xff))
			 {
				 printf("输入文件为BigEndian格式,请使用UTF16BE_BIG5标识转换\n");
				 return 2;
			 }
			 else
			 {
				printf("警告:输入文件没有BOM标识\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -