vshuo7013 2020-01-21 10:37 采纳率: 9.1%
浏览 438
已结题

utf8与unicode转码问题

1.如将带中文的字符串转成unicode的格式,然后如何再转回来,

注:字符串中既有英文又有中文
代码由C语言实现。

  • 写回答

3条回答 默认 最新

  • 窝米逗佛~ 2020-01-21 11:01
    关注

    https://www.cnblogs.com/cfas/p/7931787.html
    这个试试

    /*****************************************************************************
    * 将一个字符的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( const /*unsigned*/ char* pInput, unsigned int length,/*unsigned*/ char *Unic )
    {
        assert( pInput != NULL && Unic != NULL );
    
        // b1 表示UTF-8编码的pInput中的高字节, b2 表示次高字节, ...
        char b1, b2, b3, b4, b5, b6;
    
        int utfbytes = 0;
        unsigned char *pOutput = ( unsigned char * )Unic;
        int n = 0;
        while ( true )
        {
    
            //*Unic = 0x0; // 把 *Unic 初始化为全零
            utfbytes = enc_get_utf8_size( *pInput );
    
            switch ( utfbytes )
            {
            case 0:
                *pOutput = *pInput;
                utfbytes += 1;
                break;
            case 2:
                b1 = *pInput;
                b2 = *( pInput + 1 );
                if ( ( b2 & 0xE0 ) != 0x80 )
                    return 0;
                *pOutput = ( b1 << 6 ) + ( b2 & 0x3F );
                *( pOutput + 1 ) = ( b1 >> 2 ) & 0x07;
                break;
            case 3:
                b1 = *pInput;
                b2 = *( ++pInput );
                b3 = *( ++pInput );
                if ( ( ( b2 & 0xC0 ) != 0x80 ) || ( ( b3 & 0xC0 ) != 0x80 ) )
                    return 0;
                *(pOutput+n) = ( b2 << 6 ) + ( b3 & 0x3F );
                *( pOutput+n+1  ) = ( b1 << 4 ) + ( ( b2 >> 2 ) & 0x0F );
                n += 2;
                break;
            case 4:
                b1 = *pInput;
                b2 = *( pInput + 1 );
                b3 = *( pInput + 2 );
                b4 = *( pInput + 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 = *pInput;
                b2 = *( pInput + 1 );
                b3 = *( pInput + 2 );
                b4 = *( pInput + 3 );
                b5 = *( pInput + 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 = *pInput;
                b2 = *( pInput + 1 );
                b3 = *( pInput + 2 );
                b4 = *( pInput + 3 );
                b5 = *( pInput + 4 );
                b6 = *( pInput + 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;
            }
            length -= utfbytes;
            if ( length <= 0 )
                break;
            else
                ++pInput;
        }
        return utfbytes;
    }
    int main( int argc, char** argv )
    {   
            string utf8 = CodeConverter::UnicodeToUtf8( L"成都" );
            wstring unicode = CodeConverter::Utf8ToUnicode( wsdd );
            char Unic[ 512 ] = { 0 };
            enc_utf8_to_unicode_one( wsdd.c_str(), wsdd.size(), Unic );
        }
    
    

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)