linux c实现对utf-8字符转换为unicode编码的转换

#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;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熔钧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值