📄 x2big5.c
字号:
/* convertCode.cpp : Defines the entry point for the console application. */
/***************************************************************************
* Copyright (c) 2008, .......
* All rights reserved.
*
* 文件名称:convertCode.c
* 文件标识:
* 摘 要:汉字内码转换处理函数
* @convertCode2()
* @Utf16TOBig5()
* @Utf8TOBig5()
* @Gb18030TOBig5()
* 当前版本:1.0
* 作 者:CZ
* 完成日期:
*
* 修改与优化处理:
**************************************************************************/
typedef unsigned int U32;
typedef unsigned short int U16;
typedef unsigned char U8;
typedef signed int S32;
typedef short signed int S16;
typedef signed char S8;
/*********************************************************
文件内部使用的宏
均为编码转换开关,
命名规则: _源码类型_目标嘛类型,其中GB表示GB18030码,如_GB_BIG5表示将GB18030编码转换为BIG5码
取值规则: 需要相应编码转换时将对应的宏定义为1,反之为0
*****************************************************/
#define _UTF16_BIG5 0
#define _UTF8_BIG5 0
#define _GB_BIG5 1
#define _A02 1
#define _BIG_ENDIAN 0
#define _LITTLE_ENDIAN 1
#define CONVERT_OK 0
#define CONVERT_ERROR 1
#define INPUTCODE_ERROR 2
#define INPUTLEN_ERROR 3
#if (_UTF16_BIG5 || _UTF8_BIG5)
/* ".\TB_X2BIG5\UTF16_BIG5_2B_H.h" 里定义: U16 TB_UTF16_BIG5[][256] */
/* 以下地址值需查字库说明得到 */
#if (_LITTLE_ENDIAN)
U16 * TB_UTF16_BIG5 = (U16 *)0x280000;
#elif (_BIG_ENDIAN)
U16 * TB_UTF16_BIG5 = (U16 *)0x2A0000;
#endif
#endif
#if (_GB_BIG5)
U16 *TB_GB_BIG5 = (U16 *)0x2c0000; /* 这个值需查字库说明得到 */
#endif
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);
#if (_UTF16_BIG5 )
/***************************************************************************
* 函数名称: Utf16TOBig5
* 作者 : CZ
* 函数功能 : 将Utf16编码的字符转换为GB18030编码
* 接口描述:
*
* 输入参数:
* pu16InputCode - 输入的Utf16编码字符的存储地址
* pu8OutputCode - 供存放输出的BIG5编码字符的首地址
* pu8OutputLen - 供存放输出的BIG5编码字符字节数的地址
* 返回参数:CONVERT_OK - 转换成功 CONVERT_ERROR - 转换失败
* 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
* 影响的参数:无
*
*
* 补充说明:
*****************************************************************************/
S8 Utf16TOBig5(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen)
{
U16 u16InData,u16OutData;
U8 u8DataH,u8DataL;
/* 取得输入的UTF16数据,并分成高低位 */
u16InData = *(pu16InputCode);
u8DataH = u16InData >> 8;
u8DataL = u16InData & 0xff;
/* 读出转换表结果 u16OutData = TB_UTF16_BIG5[u8DataH][u8DataL]; */
u16OutData = TB_UTF16_BIG5[u8DataH*256 + u8DataL];
/* 单字节以及无对应结果的情况判断 */
if (u16OutData <= 0xff)
{
if ((u16OutData == 0)&&(u16InData != 0))
{ /* 无对应结果 */
* pu8OutputLen = 0;
return CONVERT_ERROR;
}
else
{ /* 单字节结果 */
* pu8OutputLen = 1;
pu8OutputCode[0] = (U8)u16OutData;
return CONVERT_OK;
}
}
/* 余下的为2字节的情况 */
* pu8OutputLen = 2;
pu8OutputCode[0] = u16OutData >> 8;
pu8OutputCode[1] = u16OutData & 0xff;
return CONVERT_OK;
}
#endif
#if (_UTF8_BIG5)
/***************************************************************************
* 函数名称: Utf8TOBig5
* 作者 : CZ
* 函数功能 : 将Utf8编码的字符转换为BIG5编码
* 接口描述:
*
* 输入参数:
* pu8InputCode - 输入的Utf8编码字符的存储地址
* u8InputLen - 输入的Utf8编码字符的长度
* pu8OutputCode - 供存放输出的BIG5编码字符的首地址
* pu8OutputLen - 供存放输出的BIG5编码字符字节数的地址
* 返回参数:CONVERT_OK - 转换成功 CONVERT_ERROR - 转换失败
* 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
* 影响的参数:无
*
*
* 补充说明:
*****************************************************************************/
S8 Utf8TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
{
U16 u16InData,u16OutData;
U8 u8DataH,u8DataL;
switch(u8InputLen)
{
case 1: /* */
u8DataH = 0;
u8DataL = pu8InputCode[0] ;
u16InData = (U16)u8DataL;
if(u8DataL > 0x7f)
{
* pu8OutputLen = 0;
return INPUTCODE_ERROR;
}
else
{ /* ACSII 码,转换结果即为本身 */
* pu8OutputLen = 1;
pu8OutputCode[0] = u8DataL;
return CONVERT_OK;
}
break;
case 2:
u8DataH = (pu8InputCode[0] & 0x1f) >> 2;
u8DataL = ((pu8InputCode[0] & 0x3) << 6) + (pu8InputCode[1] & 0x3f);
u16InData = (u8DataH << 8) + u8DataL;
break;
case 3:
u8DataH = ((pu8InputCode[0] & 0x0F) << 4) | ((pu8InputCode[1] >> 2) & 0x0F);
u8DataL = ((pu8InputCode[1] & 0x03) << 6) + (pu8InputCode[2] & 0x3F);
u16InData = (u8DataH << 8) + u8DataL;
break;
default:
* pu8OutputLen = 0;
return INPUTLEN_ERROR;
}
/* 读出转换表结果u16OutData = TB_UTF16_BIG5[u8DataH][u8DataL]; */
u16OutData = TB_UTF16_BIG5[u8DataH*256 + u8DataL];
/* 单字节以及无对应结果的情况判断 */
if (u16OutData <= 0xff)
{
if ((u16OutData == 0)&&(u16InData != 0))
{ /* 无对应结果 */
* pu8OutputLen = 0;
return CONVERT_ERROR;
}
else
{ /* 单字节结果 */
* pu8OutputLen = 1;
pu8OutputCode[0] = (U8)u16OutData;
return CONVERT_OK;
}
}
/* 余下的为2字节的情况 */
* pu8OutputLen = 2;
pu8OutputCode[0] = u16OutData >> 8;
pu8OutputCode[1] = u16OutData & 0xff;
return CONVERT_OK;
}
#endif
#if (_GB_BIG5)
/***************************************************************************
* 函数名称: Gb18030TOBig5
* 作者 : CZ
* 函数功能 : 将Utf8编码的字符转换为BIG5编码
* 接口描述:
*
* 输入参数:
* pu8InputCode - 输入的GB18030编码字符的存储地址
* u8InputLen - 输入的GB18030编码字符的长度
* pu8OutputCode - 供存放输出的BIG5编码字符的首地址
* pu8OutputLen - 供存放输出的BIG5编码字符字节数的地址
* 返回参数:CONVERT_OK - 转换成功 CONVERT_ERROR - 转换失败
* 转换成功时,输出的字符存放在pu8OutputCode,长度存放在pu8OutputLen
*
* 影响的参数:无
*
*
* 补充说明:
*****************************************************************************/
S8 Gb18030TOBig5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen)
{
U16 u16OutData;
U8 u8DataH,u8DataL;
/* 参数检查,如果是4字节GB18030代码,将无法转换,直接返回出错 */
if(u8InputLen != 2)
{ /* 如果是ASCII码,直接转换 */
if((u8InputLen == 1)&&(pu8InputCode[0] < 0x80))
{
* pu8OutputLen = 1;
pu8OutputCode[0] = pu8InputCode[0];
return CONVERT_OK;
}
/* 参数出错 */
* pu8OutputLen = 0;
return CONVERT_ERROR;
}
/* 取得输入的GB数据,并分成高低位 */
u8DataH = pu8InputCode[0];
u8DataL = pu8InputCode[1];
/* GB码汉字的高字节必须大于0x80,判断之 */
if( u8DataH < 0x81)
{
* pu8OutputLen = 0;
return INPUTCODE_ERROR;
}
/* 因为转换表是从0x8100开始的,所以需要调整u8DataH */
u8DataH -= 0x81;
/* 读出转换表结果 u16OutData = TB_GB_BIG5[u8DataH][u8DataL]; */
u16OutData = TB_GB_BIG5[u8DataH*256 + u8DataL];
/* 单字节以及无对应结果的情况判断 */
if (u16OutData <= 0xff)
{
if (u16OutData == 0)
{ /* 无对应结果,这里可以排除输入为0导致结果为0的情况,因为u8DataH >= 0x81 */
* pu8OutputLen = 0;
return CONVERT_ERROR;
}
else
{ /* 单字节结果 */
* pu8OutputLen = 1;
pu8OutputCode[0] = (U8)u16OutData;
return CONVERT_OK;
}
}
/* 余下的为2字节的情况 */
* pu8OutputLen = 2;
pu8OutputCode[0] = u16OutData >> 8;
pu8OutputCode[1] = u16OutData & 0xff;
return CONVERT_OK;
}
#endif
#if (_A02)
/***************************************************************************
* 函数名称: convertCode2
* 作者 : CZ
* 函数功能 : 在A02项目中,将特定编码的字符转换为BIG5编码
* 接口描述:
*
* 输入参数:
* U8 u8cmd - 输入编码选项 , =1时表示 GB18030->BIG5
* pu8InputCodeH - 指针,指向输入的编码字符的高字节,但在UTF8情况下,pu8InputCodeH指向输入字节首地址,pu8InputCodeL里的值表示输入长度
* pu8InputCodeL - 指针,指向输入的编码字符的低字节,但在UTF8情况下,pu8InputCodeL里的值表示输入长度
* pu8OutputCode - 供存放输出的2字节编码字符的首地址
*
* 返回参数:CONVERT_OK - 转换成功 CONVERT_ERROR - 转换失败
* 转换成功时,输出的字符存放在pu8OutputCode,
* 同时因移植兼容性需要,(* pu8InputCodeH)与(* pu8InputCodeL)也被分别改为输出字符的高低字节
*
* 影响的参数:因移植兼容性需要,(* pu8InputCodeH)与(* pu8InputCodeL)被分别改写为输出字符的高低字节
*
*
* 补充说明:
*
*****************************************************************************/
U8 convertCode2(U8 u8cmd, U8* pu8InputCodeH, U8* pu8InputCodeL, U16* pu8OutputCode)
{
U8 GbCode[4];
U8 u8len;
U8 inputCode[2];
U8 h,l,d;
U16 u16inputCode;
inputCode[0] = *pu8InputCodeH;
inputCode[1] = *pu8InputCodeL;
switch(u8cmd)
{
#if (_GB_BIG5)
case 1 : /* BIG5->GB18030 : Big5TOBIG5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen) */
if ( Gb18030TOBig5(inputCode, 2, GbCode, &u8len) == CONVERT_ERROR )
{
return CONVERT_ERROR;
}
break;
#endif
#if (_UTF16_BIG5)
case 2 : /* UTF8->GB18030: S8 Utf16TOBIG5(U16* pu16InputCode, U8* pu8OutputCode, U8* pu8OutputLen) */
u16inputCode = (inputCode[0]<<8)|(inputCode[1]); // 注意,这里假定pu8InputCodeH指向unicode的高位
if ( Utf16TOBig5(&u16inputCode, GbCode, &u8len) == CONVERT_ERROR )
{
return CONVERT_ERROR;
}
break;
#endif
#if (_UTF8_BIG5)
case 3 : /* UTF8->GB18030: Utf8TOBIG5(U8* pu8InputCode, U8 u8InputLen, U8* pu8OutputCode, U8* pu8OutputLen) */
/* 注意,在UTF8情况下,pu8InputCodeH指向输入字节首地址,pu8InputCodeL里的值表示输入长度 */
if ( Utf8TOBig5(pu8InputCodeH, inputCode[1], GbCode, &u8len) == CONVERT_ERROR )
{
return CONVERT_ERROR;
}
break;
#endif
default:
return CONVERT_ERROR;
}
h=GbCode[0];
l=GbCode[1];
if(u8len ==2)
{
(* pu8OutputCode) = h*256 + l ;
}
else if(u8len ==1)
{
(* pu8OutputCode) = h ;
}
else
{
return CONVERT_ERROR;
}
* pu8InputCodeH = (* pu8OutputCode)>>8;
* pu8InputCodeL = (U8)(* pu8OutputCode) ;
return CONVERT_OK;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -