#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <iconv.h>
#define True 1
#define False 0
typedef unsigned char byte; //定义一个无符号1字节
typedef char cbyte; //定义一个有符号1字节
typedef unsigned char boolean; //定义一个bool类型
typedef unsigned short uword; //定义一个无符号2字节
typedef short word; //定义一个有符号2字节
typedef unsigned int udword; //定义一个无符号4字节
typedef int dword; //定义一个有符号4字节
typedef unsigned long Dword; //定义一个无符号8字节
typedef long uDword; //定义一个有符号8字节
/*****************************************************************************
* 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码.
*
* 参数:
* pInput 指向输入缓冲区, 以UTF-8编码
* Unic 指向输出缓冲区, 其保存的数据即是Unicode编码值,
* 类型为unsigned long .
*
* 返回值:
* 成功则返回该字符的UTF8编码所占用的字节数; 失败则返回0.
*
* 注意:
* 1. UTF8没有字节序问题, 但是Unicode有字节序要求;
* 字节序分为大端(Big Endian)和小端(Little Endian)两种;
* 在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位)
****************************************************************************/
int enc_utf8_to_unicode_one(byte* pInput,byte *Dec,byte utfbytes) //cn 表示每个占几个字节 电话号码数字为1 汉字为3
{
int i=0,j=0; //变量
byte strDa[6]; //存储每一个
unsigned char *pOutput; //输出的存储空间
unsigned long Unic=0; //用来存放转换后的数据
char b1, b2, b3, b4, b5, b6; // b1 表示UTF-8编码的pInput中的高字节, b2 表示次高字节, ...
//实现字符串处理
for(i=0;i<strlen(pInput)/utfbytes;i++)
{
memcpy(strDa,pInput+i*utfbytes,utfbytes); strDa[utfbytes]='\0'; //取出其中的转换字符
printf("\n str=%s\n",strDa); //打印显示
pOutput=(byte*)&Unic; //将指针指向
switch ( utfbytes ) //判定对应的个数
{
case 1:
*pOutput = *strDa;
break;
case 2:
b1 = *strDa;
b2 = *(strDa + 1);
if ( (b2 & 0xE0) != 0x80 )
return 0;
*pOutput = (b1 << 6) + (b2 & 0x3F);
*(pOutput+1) = (b1 >> 2) & 0x07;
break;
case 3:
b1 = *strDa;
b2 = *(strDa + 1);
b3 = *(strDa + 2);
if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) )
return 0;
*pOutput = (b2 << 6) + (b3 & 0x3F);
*(pOutput+1) = (b1 << 4) + ((b2 >> 2) & 0x0F);
break;
case 4:
b1 = *strDa;
b2 = *(strDa + 1);
b3 = *(strDa + 2);
b4 = *(strDa + 3);
if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
|| ((b4 & 0xC0) != 0x80) )
return 0;
*pOutput = (b3 << 6) + (b4 & 0x3F);
*(pOutput+1) = (b2 << 4) + ((b3 >> 2) & 0x0F);
*(pOutput+2) = ((b1 << 2) & 0x1C) + ((b2 >> 4) & 0x03);
break;
case 5:
b1 = *strDa;
b2 = *(strDa + 1);
b3 = *(strDa + 2);
b4 = *(strDa + 3);
b5 = *(strDa + 4);
if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
|| ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80) )
return 0;
*pOutput = (b4 << 6) + (b5 & 0x3F);
*(pOutput+1) = (b3 << 4) + ((b4 >> 2) & 0x0F);
*(pOutput+2) = (b2 << 2) + ((b3 >> 4) & 0x03);
*(pOutput+3) = (b1 << 6);
break;
case 6:
b1 = *strDa;
b2 = *(strDa + 1);
b3 = *(strDa + 2);
b4 = *(strDa + 3);
b5 = *(strDa + 4);
b6 = *(strDa + 5);
if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
|| ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80)
|| ((b6 & 0xC0) != 0x80) )
return 0;
*pOutput = (b5 << 6) + (b6 & 0x3F);
*(pOutput+1) = (b5 << 4) + ((b6 >> 2) & 0x0F);
*(pOutput+2) = (b3 << 2) + ((b4 >> 4) & 0x03);
*(pOutput+3) = ((b1 << 6) & 0x40) + (b2 & 0x3F);
break;
default:
return 0;
break;
} //switch
//把数据进行返回
Dec[2*i]=pOutput[1];
Dec[2*i+1]=pOutput[0];
//printf("utfbytes=%d,%02x%02x",utfbytes,pOutput[1],pOutput[0]);
} //for
}
int main ()
{
int i;
byte data[32];
byte num[] = "15562593585";
byte text[]="您好!姜先生";
unsigned long bb;
printf("num=%s,count=%ld\n",num,strlen(num));
printf("text=%s,count=%ld\n",text,strlen(text));
enc_utf8_to_unicode_one(num,data,1); //因为字符存储为1字节
for(i=0;i<22;i++) printf("%02x",data[i]);
enc_utf8_to_unicode_one(text,data,3); //因为中文存储为3字节
for(i=0;i<12;i++) printf("%02x",data[i]);
return 0;
}