C++ GBK转UTF8 求教啊。

时间:2021-07-14 03:30:26
#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;


string GBKToUTF8(const string& strGBK)
{
string strOutUTF8 = "";
WCHAR * str1;
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char * str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
strOutUTF8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return strOutUTF8;
}

string strXml = "<?xml version=\"1.0\">\n\
<Action>\n\
\t<Variable>这是一个测试</Variable>\n\
\t<Query>\n\
\t\t<Address>阿防盗斯</Address>\n\
\t</Query>\n\
</Action>\n";

int main()
{
cout << strXml << endl;
cout << "\n---------------------------------\n" << endl;
cout << GBKToUTF8(strXml) << endl;
return 0;
}


//--------------------------------------------
这是一个XML内容,从GBK转UTF8的测试程序,转换后
<Variable>这是一个测 试</Variable>

<Variable>杩欐槸涓€涓祴璇?/Variable>   //这里出现了个问号,并且'<'没了,测试发现只有某些特定字符才会出现问号,并覆盖后一个字符


请问大神们,怎么解决啊,怎么不出现问号,'<'也不被覆盖掉,纠结几天了。。。

13 个解决方案

#1


遍历xml文件,把节点的内容转码,再写入一个新的xml文件

#2


你把中文全部转成  &#xxxx; 的形式吧, 

#3


怎么转

#4


引用 3 楼  的回复:
怎么转


用iconv这个库和easy的嘛:

#include <iconv.h>
#pragma comment(lib,"iconv.lib")
 
int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
         iconv_t cd;
         const char **pin = &inbuf;
         char **pout = &outbuf;
 
         cd = iconv_open(to_charset,from_charset);
         if (cd==0) return -1;
         memset(outbuf,0,outlen);
         if (iconv(cd, pin, &inlen,pout, &outlen)==-1) return -1;
         iconv_close(cd);
         return 0;
}
 
/* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}
 
/* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}

#5


补充一下:iconv是跨平台的,windows,linux...都可以用

#6


引用 3 楼  的回复:
怎么转


比如中文‘测’字,unicode编码时值为0x6d4b,那么你就吧它变成 &#x6d4b; 就可以了;

<Variable>这是一个测试</Variable> 就转成
<Variable>&#x8fd9;&#x662f;&#x4e00;&#x4e2a;&#x6d4b;&#x8bd5;</Variable>

#7


引用楼主  的回复:
C/C++ code
#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;


string GBKToUTF8(const string&amp; strGBK)
{
    string strOutUTF8 = "";
    WCHAR * str1;
    int n = Mu……


研究了一下, 结论是推荐用UTF-16(Unicode). UTF-8一般用于进程间传递数据。 
如果手上有UTF-16(Uniocde)的字符串,想转成DBCS,就用GBK(code page: 936)编码.

::WideCharToMultiByte(936,
 0,
str.c_str(),
str.length(),
pElementText,
2048,
NULL,
NULL );

#8


因为GBK是支持中文字符最多的非UNICODE编码方法

#9


引用 4 楼  的回复:
引用 3 楼  的回复:

怎么转


用iconv这个库和easy的嘛:
C/C++ code

#include <iconv.h>
#pragma comment(lib,"iconv.lib")
 
int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,cha……


这样还是会出现?,并且覆盖<哦

#10


你可以去看我的博客,里面有转换。。

#11


引用 10 楼  的回复:
你可以去看我的博客,里面有转换。。


恩,借用了你那里面的代码,还是不行,只要是“试”字转换UTF8后,后面跟上“<”就要出现那种情况。
UTF8转换回GBK是没有问题,我想转换编码方面是没有问题的,现在想问下WideCharToMultiByte函数的最后两个参数,不指定为空, 给不能转换的字符指定个默认值,不显示“?”,有用过的大神没啊,看了好久,真不会。。。

#12


感谢4楼 pathuang68
今天借用了你的处理方法,  C++ GBK转UTF8 求教啊。

#13


楼主应该是和的VS吧!

#1


遍历xml文件,把节点的内容转码,再写入一个新的xml文件

#2


你把中文全部转成  &#xxxx; 的形式吧, 

#3


怎么转

#4


引用 3 楼  的回复:
怎么转


用iconv这个库和easy的嘛:

#include <iconv.h>
#pragma comment(lib,"iconv.lib")
 
int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,char *outbuf, size_t outlen)
{
         iconv_t cd;
         const char **pin = &inbuf;
         char **pout = &outbuf;
 
         cd = iconv_open(to_charset,from_charset);
         if (cd==0) return -1;
         memset(outbuf,0,outlen);
         if (iconv(cd, pin, &inlen,pout, &outlen)==-1) return -1;
         iconv_close(cd);
         return 0;
}
 
/* UTF-8 to GBK  */
int u2g(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("UTF-8","GBK",inbuf,inlen,outbuf,outlen);
}
 
/* GBK to UTF-8 */
int g2u(const char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
         return code_convert("GBK", "UTF-8", inbuf, inlen, outbuf, outlen);
}

#5


补充一下:iconv是跨平台的,windows,linux...都可以用

#6


引用 3 楼  的回复:
怎么转


比如中文‘测’字,unicode编码时值为0x6d4b,那么你就吧它变成 &#x6d4b; 就可以了;

<Variable>这是一个测试</Variable> 就转成
<Variable>&#x8fd9;&#x662f;&#x4e00;&#x4e2a;&#x6d4b;&#x8bd5;</Variable>

#7


引用楼主  的回复:
C/C++ code
#include <iostream>
#include <string>
#include <Windows.h>

using namespace std;


string GBKToUTF8(const string&amp; strGBK)
{
    string strOutUTF8 = "";
    WCHAR * str1;
    int n = Mu……


研究了一下, 结论是推荐用UTF-16(Unicode). UTF-8一般用于进程间传递数据。 
如果手上有UTF-16(Uniocde)的字符串,想转成DBCS,就用GBK(code page: 936)编码.

::WideCharToMultiByte(936,
 0,
str.c_str(),
str.length(),
pElementText,
2048,
NULL,
NULL );

#8


因为GBK是支持中文字符最多的非UNICODE编码方法

#9


引用 4 楼  的回复:
引用 3 楼  的回复:

怎么转


用iconv这个库和easy的嘛:
C/C++ code

#include <iconv.h>
#pragma comment(lib,"iconv.lib")
 
int code_convert(char *from_charset,char *to_charset,const char *inbuf, size_t inlen,cha……


这样还是会出现?,并且覆盖<哦

#10


你可以去看我的博客,里面有转换。。

#11


引用 10 楼  的回复:
你可以去看我的博客,里面有转换。。


恩,借用了你那里面的代码,还是不行,只要是“试”字转换UTF8后,后面跟上“<”就要出现那种情况。
UTF8转换回GBK是没有问题,我想转换编码方面是没有问题的,现在想问下WideCharToMultiByte函数的最后两个参数,不指定为空, 给不能转换的字符指定个默认值,不显示“?”,有用过的大神没啊,看了好久,真不会。。。

#12


感谢4楼 pathuang68
今天借用了你的处理方法,  C++ GBK转UTF8 求教啊。

#13


楼主应该是和的VS吧!