c++中如何将unicode编码转化成utf-8

CoolEgos 2014-06-02 09:47:45
用C++调用web service一直出现乱码,应该是要转化成utf-8



怎么在VS 2010下将unicode转换成utf-8??
...全文
787 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
maya8maya85 2016-07-23
  • 打赏
  • 举报
回复
这个赵四就喜欢说这些棱模两可的话。
zgl7903 2016-07-23
  • 打赏
  • 举报
回复
ANSI 转成 UTF8 要转两次 MultiByteToWideChar(CP_CAP 先转为 UNICODE 然后 WideCharToMultiByte(CP_UTF8 把UNICODE 转为UTF8
赵4老师 2014-06-03
  • 打赏
  • 举报
回复
都说了“不保证对,仅供参考:”了。 测试驱动,这个是刚亲自编译链接运行了的:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
char *UnicodeToUtf8(LPWSTR pUnicode) {
    const int MAXL=16;//为测试超长方便,此处将1024替换为16;
    static char Utf8[MAXL*4];
    UINT nLength;

    Utf8[0]=0;
    if (pUnicode==NULL) return (char *)Utf8;
    nLength=__min((int)wcslen(pUnicode),MAXL-1);
    WideCharToMultiByte(CP_UTF8, 0, pUnicode, nLength, (LPSTR)Utf8, MAXL*4, NULL,NULL);
    return (char *)Utf8;
}
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
int main() {
    char *p;

    setlocale(LC_ALL,"chs");
    printf("--1--\n");
    p=UnicodeToUtf8(NULL);
    HexDump(p,strlen(p)+1,(int)&p);
    printf("--2--\n");
    p=UnicodeToUtf8(L"啊");
    HexDump(p,strlen(p)+1,(int)&p);
    printf("--3--\n");
    p=UnicodeToUtf8(L"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊");
    HexDump(p,strlen(p)+1,(int)&p);
    printf("--4--\n");
    p=UnicodeToUtf8(L"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊哈");
    HexDump(p,strlen(p)+1,(int)&p);

    return 0;
}
//--1--
//0012ff6c - 00                                               .
//--2--
//0012ff6c - e5 95 8a 00                                      ....
//--3--
//0012ff6c - e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5  ................
//0012ff7c - 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95  ................
//0012ff8c - 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a 00        ..............
//--4--
//0012ff6c - e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5  ................
//0012ff7c - 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a e5 95  ................
//0012ff8c - 8a e5 95 8a e5 95 8a e5 95 8a e5 95 8a 00        ..............
//
CoolEgos 2014-06-03
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
不保证对,仅供参考:
char *UnicodeToUtf8(LPCSTR pUnicode)
{
    const int MAXL=1024;
    static char Utf8[MAXL*4];
    UINT nLength;

    Utf8[0]=0;
    if (pUnicode==NULL) return (char *)Utf8;
    nLength=__min((int)wcslen(pUnicode),MAXL-1);
    WideCharToMultiByte(CP_UTF8, 0, pUnicode, nLength, (LPSTR)Utf8, NULL,NULL);
    return (char *)Utf8;
}
有问题吧。。
赵4老师 2014-06-03
  • 打赏
  • 举报
回复
不保证对,仅供参考:
char *UnicodeToUtf8(LPCSTR pUnicode)
{
    const int MAXL=1024;
    static char Utf8[MAXL*4];
    UINT nLength;

    Utf8[0]=0;
    if (pUnicode==NULL) return (char *)Utf8;
    nLength=__min((int)wcslen(pUnicode),MAXL-1);
    WideCharToMultiByte(CP_UTF8, 0, pUnicode, nLength, (LPSTR)Utf8, NULL,NULL);
    return (char *)Utf8;
}
CoolEgos 2014-06-03
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
CStringW Utf8ToUnicode(LPCSTR pUtf8)
{
	if (pUtf8==NULL)
		return L"";

	UINT nLength=strlen(pUtf8);
	int nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, NULL, 0);
	CStringW tempBuffer;

	nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, (LPWSTR)tempBuffer.GetBufferSetLength(nChar), nChar);
	if(nChar == 0)
	{
		return L"";
	}
	tempBuffer.ReleaseBuffer();

	return tempBuffer;
}
因为传入的参数是utf-8的格式,所以需要转化为utf-8的格式,不是将utf-8转化为unicode。 还有就是我最希望能写成这样的 char *s=ConvAnsiToUtf8("123456"); 就是将“123456”转化成utf-8类型然后赋值给s; 不知道怎么写啊
xiaohuh421 2014-06-02
  • 打赏
  • 举报
回复
CStringW Utf8ToUnicode(LPCSTR pUtf8)
{
	if (pUtf8==NULL)
		return L"";

	UINT nLength=strlen(pUtf8);
	int nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, NULL, 0);
	CStringW tempBuffer;

	nChar = MultiByteToWideChar(CP_UTF8, 0, pUtf8, nLength, (LPWSTR)tempBuffer.GetBufferSetLength(nChar), nChar);
	if(nChar == 0)
	{
		return L"";
	}
	tempBuffer.ReleaseBuffer();

	return tempBuffer;
}

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧