设为首页 加入收藏

TOP

C++中Unicode与UTF-8编码互转
2016-12-06 20:24:45 】 浏览:297
Tags:Unicode UTF-8 编码

1、简述

最近在发送网络请求时遇到了中文字符乱码的问题,在代码中调试字符正常,用抓包工具抓的包中文字符显示正常,就是发送到服务器就显示乱码了,那就要将客户端和服务器设置统一的编码(UTF-8),而我们程序中 一般用的是Unicode编码,所以这就需要将中文字符转为UTF-8格式的,其他英文字符和数字就不需要转了。下面就讲述一下方法。

2、代码之路

Unicode 转 UTF-8

char* UnicodeToUtf8(const wchar_t* unicode)
{
    int len;
    len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
    char *szUtf8 = (char*)malloc(len + 1);
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
    return szUtf8;
}

int main(int argc, char *argv[])
{
    wchar_t* wCharUnicode = L"中国";
    char* cCharUtf = UnicodeToUtf8(wCharUnicode);

    return 0;
}

结果如下:

我们看到转为UTF-8之后在VS中查看时显示为其他字符。为了验证我们转的字符是否正确,我们可以借用NotePad++这个工具。我们新建一个文件,用NotePad++打开,文件编码默认为ANSI格式,这里显示的跟VS中调试时显示的值是一样的。

我们修改文件编码为UTF-8之后再看一下,是不是显示正常了,所以验证了转换代码正确。


UTF-8 转 Unicode

CString UTF82WCS(const char* szU8)
{
    //预转换,得到所需空间的大小;
    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);

    //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
    wchar_t* wszString = new wchar_t[wcsLen + 1];

    //转换
    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);

    //最后加上'\0'
    wszString[wcsLen] = '\0';

    CString unicodeString(wszString);

    delete[] wszString;
    wszString = NULL;

    return unicodeString;
}

int main(int argc, char *argv[])
{
    wchar_t* wCharUnicode = L"中国";
    char* cCharUtf = UnicodeToUtf8(wCharUnicode);
    CString strUnicode = UTF82WCS(cCharUtf);

    return 0;
}

从结果中我们看到,成功地将UTF-8编码转为Unicode编码,代码很简单,还是要多思考,多练,多查阅资料。


下面给出几个小实例,看一下转换结果。

实例一:

wchar_t* wCharUnicode = L"中国你好";
char* cCharUtf = UnicodeToUtf8(wCharUnicode);
CString strUnicode = UTF82WCS(cCharUtf);

实例二:

wchar_t* wCharUnicode = L"中国,你好";
char* cCharUtf = UnicodeToUtf8(wCharUnicode);
CString strUnicode = UTF82WCS(cCharUtf);

这里在中文 “中国”和“你好”之间加了英文的标点符号,显示正常。

实例三:

wchar_t* wCharUnicode = L"中国,你好";
char* cCharUtf = UnicodeToUtf8(wCharUnicode);
CString strUtf(cCharUtf);
CString strUnicode = UTF82WCS(cCharUtf);

这里在中文 “中国”和“你好”之间加了中文的标点符号,cCharUtf 在VS中看不到值,但是可以转成CString查看其值,结果正确。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++编程入门(44)多态性:多态的.. 下一篇C++笔试面试常考知识点汇总(三)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目