美文网首页
UTF8格式向GB2312格式转换[C源码](转)

UTF8格式向GB2312格式转换[C源码](转)

作者: 贰爷 | 来源:发表于2020-08-07 14:47 被阅读0次

    /***************************************************************************
    * 文 件 名: UTF8_UCS2_GB2312.CPP

    * 版 本 号: V1.0.0.1

    * 作  者: lianxiuzhu

    * 创建时间: 2008-05-22 11:48:13

    * 文件描述: 从UTF8格式字符串转换成GB2312编码格式(经由UCS2编码)
    *       UCS2编码是对双字节编码的统一描述,Unicode就是其中一种
    * 假定条件: 用户输入到程序的UTF8字符串是符合UTF8基本规范
    *       否则,程序执行的结果不可预料(包括产生异常)
    ***************************************************************************/

    include <stdio.h>

    include <stdlib.h>

    include <locale.h>

    typedef char S8;  //有符号8位
    typedef short S16;  //有符号16位
    typedef int S32;  //有符号32位
    typedef unsigned char U8;  //无符号8位
    typedef unsigned short U16;  //无符号16位
    typedef unsigned int U32;  //无符号32位

    /***************************************************************************
    * 函数名称: RealVal
    * 功能描述: 计算'0' - '9', 'a' - 'z', 'A - Z'分别对应的十进制数值
    * 日  期: 2008-05-22 11:57:56
    * 作  者: lianxiuzhu
    * 参数说明: c - 十六进制字符
    * 返 回 值: 对应的十进制数值
    ***************************************************************************/
    U8 RealVal(S8 c)
    {
      if(c >= '0' && c <= '9')
      {
        return (c - 48);
      }
      else if(c >= 'a' && c <= 'f')
      {
        return (c - 87);
      }
      else if(c >= 'A' && c <= 'F')
      {
        return (c - 55);
      }
      else
      {
        return 0;
      }
    }

    /***************************************************************************
     函数名称: UTF8StringToStream
     功能描述: 从UTF8格式的字符串转换成UTF8字节流数组(%E9%90-->0xE9,0x90)
     日  期: 2008-05-22 13:34:01
     作  者: lianxiuzhu
     参数说明: szUTF8  - UTF8格式的字符串
           binUTF8  - UTF8字节流数组
     返 回 值: 转换到UTF8字节流数组中字节数
    ***************************************************************************/
    U32 UTF8StringToStream(const S8
    szUTF8, U8
    binUTF8)
    {
      U32 uCount = 0;
      S8
    szTemp = (S8
    )szUTF8;
      while(
    szTemp != '\0')
      {
        if(
    szTemp == '%')
        {
          binUTF8[uCount] = RealVal(
    (szTemp + 1)) * 0x10 + RealVal((szTemp + 2));
          szTemp = szTemp + 3;
        }
        else if(
    szTemp == '+')
        {
          binUTF8[uCount] = 0x20;
          szTemp = szTemp + 1;
        }
        else
        {
          binUTF8[uCount] = *szTemp;
          szTemp = szTemp + 1;
        }
        
        uCount = uCount + 1;
      }
      
      return uCount;
    }

    /***************************************************************************
     函数名称: UTF8ToUCS2
     功能描述: 转换UTF8格式到UCS2格式(UCS2是双字节编码,Unicode是其中一种)
     日  期: 2008-05-22 13:36:56
     作  者: lianxiuzhu
     参数说明: binUTF8  - UTF8字节流数组
           uCount  - UTF8字节流数组中的字节数
           binUCS2  - UCS2字节流数组
     返 回 值: 转换到UCS2字节流数组中的U16单元个数
    ***************************************************************************/
    U32 UTF8ToUCS2(const U8
    binUTF8, U32 uCount, U16
    binUCS2)
    {
      U32 uLength = 0;
      U8
    szTemp = (U8
    )binUTF8;
      while((U32)(szTemp - binUTF8) < uCount)
      {
        if(
    szTemp <= 0x7F) //0xxxxxxx
        {
          binUCS2[uLength] = binUCS2[uLength] | (U16)(
    szTemp & 0x7F);
          szTemp = szTemp + 1;
        }
        else if(
    szTemp <= 0xDF) //110xxxxx 10xxxxxx
        {
          binUCS2[uLength] = binUCS2[uLength] | (U16)(
    (szTemp + 1) & 0x3F);
          binUCS2[uLength] = binUCS2[uLength] | ((U16)((szTemp) & 0x1F) << 6);
          szTemp = szTemp + 2;
        }
        else if(
    szTemp <= 0xEF) //1110xxxx 10xxxxxx 10xxxxxx
        {
          binUCS2[uLength] = binUCS2[uLength] | (U16)((szTemp + 2) & 0x3F);
          binUCS2[uLength] = binUCS2[uLength] | ((U16)(
    (szTemp + 1) & 0x3F) << 6);
          binUCS2[uLength] = binUCS2[uLength] | ((U16)(*(szTemp) & 0x0F) << 12);
          szTemp = szTemp + 3;
        }
        else
        {
          return 0;
        }
        
        uLength = uLength + 1;
      }
      
      return uLength;
    }

    /*

    • 测试用主程序:
    • 功能:将一段UTF8格式的字符串,转化成GB2312格式输出
    • 检验:如果您能看到屏幕输出“让我们永远铭记这一刻:2008年5月12日 14时28分”,成功!
      /
      int main(int argc, char
      argv[])
      {
        S8* szUTF8 = "%E8%AE%A9%E6%88%91%E4%BB%AC%E6%B0%B8%E8%BF%9C%E9%93%AD%E8%AE%B0%E8%BF%99%E4%B8%80%E5%88%BB%EF%BC%9A2008%E5%B9%B45%E6%9C%8812%E6%97%A5+14%E6%97%B628%E5%88%86";
        U8 binUTF8[512] = {0};
        U32 uCount = UTF8StringToStream(szUTF8, binUTF8);
        if(uCount > 0)
        {
          U16 binUCS2[512] = {0};
          uCount = UTF8ToUCS2(binUTF8, uCount, binUCS2);
          if(uCount > 0)
          {
            S8 szGB2312[512] = {0};
            setlocale(LC_ALL, ".936");
            wcstombs(szGB2312, (wchar_t*)binUCS2, 512);
            printf("%s\n", szGB2312);
          }
        }
        
        return uCount;
      }

    转载于:https://www.cnblogs.com/mugua/archive/2009/10/20/1586703.html

    相关文章

      网友评论

          本文标题:UTF8格式向GB2312格式转换[C源码](转)

          本文链接:https://www.haomeiwen.com/subject/nvmfdktx.html