首页 > 其他分享 >16进制UTF8字符转中文汉字

16进制UTF8字符转中文汉字

时间:2025-01-03 17:33:40浏览次数:5  
标签:return 进制 16 int UTF8 unicode utf8 include

1 UTF8转TUF16----UTF16---本系统单字节字符,字符串

#if defined(_WIN32)
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <iostream>
#endif // WIN32

#ifdef __linux__
#include<string.h>
#include<iconv.h>
#include <string>
#include <locale>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include<stdint.h>
#endif
using namespace std;

#if defined(_WIN32)
string UTF8_URL_DECODE(char* URLcode,int bytelen)
{
    if (URLcode == NULL || bytelen <= 0)
    {
        return "";
    }
    char* UTF8str = URLcode;

    //UTF8转换到UTF16

    int wcslen = ::MultiByteToWideChar(CP_UTF8, NULL, UTF8str, bytelen, NULL, 0);

    wchar_t* wszString = new wchar_t[wcslen + 1];

    ::MultiByteToWideChar(CP_UTF8, NULL, UTF8str, bytelen, wszString, wcslen);

    wszString[wcslen] = L'\0';

    std::wcout.imbue(std::locale("CHS"));

    wstring DecodeStr = wszString;

    string OutStr;

    int nLen = (int)DecodeStr.length() * 2;

    OutStr.resize(nLen, ' ');
    //CP_ACP通常对应GB2312编码;win中是宽字符转换成当前系统的ANSI页的多字符
    WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)DecodeStr.c_str(), nLen, (LPSTR)OutStr.c_str(), nLen, NULL, NULL);

    delete[] wszString;

    return OutStr;

}
#endif



#ifdef __linux__

unsigned char UTF8ToUnicode(unsigned char* utf8, unsigned int* unicode) {
    const unsigned char lut_size = 3;
    const unsigned char length_lut[] = { 2, 3, 4 };
    const unsigned char range_lut[] = { 0xE0, 0xF0, 0xF8 };
    const unsigned char mask_lut[] = { 0x1F, 0x0F, 0x07 };

    unsigned char length = 0;
    byte b = *(utf8 + 0);
    unsigned int i = 0;

    if (utf8 == NULL) {
        *unicode = 0;
        return -1;
    }
    // utf8编码兼容ASCII编码,使用0xxxxxx 表示00~7F
    if (b < 0x80) {
        *unicode = b;
        return 1;
    }
    // utf8不兼容ISO8859-1 ASCII拓展字符集
    // 同时最大支持编码6个字节即1111110X
    if (b < 0xC0 || b > 0xFD) {
        *unicode = 0;
        return -1;
    }
    for (i = 0; i < lut_size; i++) {
        if (b < range_lut[i]) {
            *unicode = b & mask_lut[i];
            length = length_lut[i];
            break;
        }
    }
    // 超过四字节的utf8编码不进行解析
    if (length == 0) {
        *unicode = 0;
        return -1;
    }
    // 取后续字节数据
    for (i = 1; i < length; i++) {
        b = *(utf8 + i);
        // 多字节utf8编码后续字节范围10xxxxxx~10111111
        if (b < 0x80 || b > 0xBF) {
            break;
        }
        *unicode <<= 6;
        // 00111111
        *unicode |= (b & 0x3F);
    }
    // 长度校验
    return (i < length) ? -1 : length;
}
/**
 * @brief 4字节unicode(usc4)字符集转utf16编码
 * @param unicode unicode字符值
 * @param *utf16 utf16编码结果
 * @return utf16长度,(2字节)单位
 */
unsigned char UnicodeToUTF16(unsigned int unicode, unsigned short* utf16) {
    // Unicode范围 U+000~U+FFFF
    // utf16编码方式:2 Byte存储,编码后等于Unicode值
    if (unicode <= 0xFFFF) {
        if (utf16 != NULL) {
            *utf16 = (unicode & 0xFFFF);
        }
        return 1;
    }
    else if (unicode <= 0xEFFFF) {
        if (utf16 != NULL) {
            // 高10位
            *(utf16 + 0) = 0xD800 + (unicode >> 10) - 0x40;
            // 低10位
            *(utf16 + 1) = 0xDC00 + (unicode & 0x03FF);
        }
        return 2;
    }

    return 0;
}


//多字符转换
int UTF16toStr(unsigned short* utf16, int lens, string& strout)
{
    if (lens > 1024)
    {
        printf("error utf16 is too long\n");
        return -1;
    }
    char psz[1024];
    wchar_t* pwsz = (wchar_t*)utf16;
    setlocale(LC_CTYPE, "");
    int cch = wcstombs(psz, pwsz, 1024);
    if (cch != 0 && cch != -1) {
        printf("%s\n", psz);
    }
    else {
        printf("error UTF16toStr %d\n", cch);
        return -1;
    }

    strout = cch;
    return 1;
}


string L_UTF8_URL_DECODE(char* URLcode, int bytelen)
{
    if (URLcode == NULL || bytelen <= 0)
    {
        return "";
    }
    char* UTF8str = URLcode;

    //UTF8转换到UTF16
    //size_t mbstowcs( wchar_t* wcstr, const char* mbstr, size_t    count)
    setlocale(LC_CTYPE, "");
    int wcslen = mbstowcs(NULL, URLcode, bytelen);
    printf(" wcslen:%d\n", wcslen);
    wchar_t* wszString = new wchar_t[wcslen + 1];

    //::MultiByteToWideChar(CP_UTF8, NULL, UTF8str, bytelen, wszString, wcslen);
    mbstowcs(wszString, URLcode, bytelen);

    wszString[wcslen] = L'\0';

    wstring DecodeStr = wszString;

    string OutStr;
    UTF16toStr((unsigned short*)wszString, DecodeStr.length(), OutStr);
    delete[] wszString;
    return OutStr;

}

#endif

int main(int argc, char* argv[])

{

    //linux-----------------------------
        // 严 utf8 E4 B8 A5
    printf("Hello world!\n");
    unsigned int buffer;
    uint8_t utf8[20];
    utf8[0] = 0xE4; "\xE4\xB8\xA5";
    utf8[1] = 0xB8;
    utf8[2] = 0xA5;
    utf8[3] = 0xE4; "\xE4\xB8\xA5";
    utf8[4] = 0xB8;
    utf8[5] = 0xA5;
    utf8[6] = '\0';
    std::string stdout2 = L_UTF8_URL_DECODE((char*)utf8, 7);
 

    return 0;


}

 

标签:return,进制,16,int,UTF8,unicode,utf8,include
From: https://www.cnblogs.com/8335IT/p/18650607

相关文章

  • RockyLinux 9.5 MySQL5.7_二进制方式+jdk1.8+tomcat9+jpress
    安装MySQL5.7#cd/opt#yuminstall-ywget#wgethttps://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz#tar-xvfmysql-5.7.10-linux-glibc2.5-x86_64.tar.gz-bash:tar:commandnotfound#yuminstall-ytar#tar-xvfmysql-5.7.10......
  • 利用JAVA爬虫获取item_search_img-按图搜索1688商品(拍立淘)接口
    引言在当今的电商领域,图像识别技术的应用越来越广泛,尤其是以图搜图功能,它极大地提高了用户的购物体验。本文将详细介绍如何利用JAVA爬虫技术获取1688商品的按图搜索接口,即拍立淘接口,实现商品的图像识别搜索。一、1688API接口概述1688作为阿里巴巴集团旗下的批发交易平台,提......
  • ybt1677软件开发
    1677:软件开发时间限制:1000ms内存限制:131072KB【题目描述】一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成\(m\)个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同......
  • 2016年5月至2018年2月之间,支持成都、武汉、郑州、西安建设国家中心城市
    国家中心城市,是中华人民共和国住房和城乡建设部编制的《全国城镇体系规划》中提出的处于城镇体系最高位置的城镇层级。国家中心城市在全国具备引领、辐射、集散功能的城市,这种功能表现在政治、经济、文化、对外交流等多方面。国家中心城市的设立始于2010年2月,是在直辖市和省会城......
  • 开源商业化 Sealos 如何做到月入 160万
    去年我写了一篇也是讲开源商业化的文章,当时是月入30万,一年过去了,我们整整涨了5倍多。本文理论结合实践,比较干货,希望对大家有帮助。我们的现状,谁在给我们付钱第一,开发者,我们已经近20万用户了,而且随着SealosDevbox的发布,活跃用户和付费用户飙增,广受用户好评,且用户已经形......
  • [ABC216H] Random Robots
    [ABC216H]RandomRobots题意有\(k\)个机器人在数轴上,位置分别是\(x_1,x_2,\dots,x_k\),\(x\)均为整数.接下来\(n\)秒,每秒每个机器人有\(\dfrac{1}{2}\)的概率不动,\(\dfrac{1}{2}\)的概率往坐标轴正方向移动一个单位距离,机器人的移动同时进行.求机器人互相......
  • ESP32-S3-N16R8在platformio中的开发板设置
    前言platformio现有的板子库里面没有ESP32-S3-N16R8(8MBPSRAM+16MBFLASH)的开发板模型,直接强行套用,要么就是解锁不了8MBPSRAM,要么就下载后运行不起来。 一、选用esp32-s3-devkitc-1开发板先选用esp32-s3-devkitc-1作为开发板模型,点击Finish后务必耐心等待。二、下载完毕......
  • 2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情
    2024165读书笔记|《飞花令·合》——人生飘忽百年内,且须酣畅万古情屈原班婕妤曹植刘绘卢思道卢照邻苏味道刘希夷李白高适杜甫司空曙白居易温庭筠韦庄窦叔向张泌林逋柳永晏殊欧阳修李觏舒亶秦观陈瓘李清照陆游辛弃疾姜夔蒋捷吴伟业纳兰性德张惠言邓廷桢《飞花令·合》......
  • 基于扩频解扩+LDPC编译码的16QAM图传通信系统matlab误码率仿真,扩频参数可设置
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):  仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要       该通信系统主要用于图像传输,适用于对图像质量和传输可靠性要求较高的场景,如无人机图像传输、视频监控、无线电视广播等......
  • 代码随想录算法训练营第二十二天| 77.组合、216.组合总和、17.电话号码的字母组合
    目录组合的递归思路来源:77.组合216.组合总和17.电话号码的字母组合组合的递归思路来源(核心是如何用递归实现多重循环):(1)用三重循环实现:3个数中选3个数(可重复),求所有可能 /*11111211312112212313113213321121221322122222......