#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
用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
比如中文‘测’字,unicode编码时值为0x6d4b,那么你就吧它变成 测 就可以了;
<Variable>这是一个测试</Variable> 就转成
<Variable>这是一个测试</Variable>
#7
研究了一下, 结论是推荐用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
这样还是会出现?,并且覆盖<哦
#10
你可以去看我的博客,里面有转换。。
#11
恩,借用了你那里面的代码,还是不行,只要是“试”字转换UTF8后,后面跟上“<”就要出现那种情况。
UTF8转换回GBK是没有问题,我想转换编码方面是没有问题的,现在想问下WideCharToMultiByte函数的最后两个参数,不指定为空, 给不能转换的字符指定个默认值,不显示“?”,有用过的大神没啊,看了好久,真不会。。。
#12
感谢4楼 pathuang68
今天借用了你的处理方法,
今天借用了你的处理方法,
#13
楼主应该是和的VS吧!
#1
遍历xml文件,把节点的内容转码,再写入一个新的xml文件
#2
你把中文全部转成 &#xxxx; 的形式吧,
#3
怎么转
#4
用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
比如中文‘测’字,unicode编码时值为0x6d4b,那么你就吧它变成 测 就可以了;
<Variable>这是一个测试</Variable> 就转成
<Variable>这是一个测试</Variable>
#7
研究了一下, 结论是推荐用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
这样还是会出现?,并且覆盖<哦
#10
你可以去看我的博客,里面有转换。。
#11
恩,借用了你那里面的代码,还是不行,只要是“试”字转换UTF8后,后面跟上“<”就要出现那种情况。
UTF8转换回GBK是没有问题,我想转换编码方面是没有问题的,现在想问下WideCharToMultiByte函数的最后两个参数,不指定为空, 给不能转换的字符指定个默认值,不显示“?”,有用过的大神没啊,看了好久,真不会。。。
#12
感谢4楼 pathuang68
今天借用了你的处理方法,
今天借用了你的处理方法,
#13
楼主应该是和的VS吧!