用tinyXML建的XML汉字乱码,变成了问号 如下面
<?xml version="1.0" encoding="utf-8" ?>
<hnisi>
<body>
<datasets>
<dataset>
<YXSDH>abc</YXSDH>
<JHDH>dep1231312312313</JHDH>
<JHRQ>2015-01-01</JHRQ>
<GHQYMC>?????ABCD</GHQYMC>
<GHQYXKZBH>????ABCD173167312</GHQYXKZBH>
<TXM>12312312</TXM>
<SCPC>12313621</SCPC>
<SL>1.1</SL>
<SCRQ>2015-01-01</SCRQ>
<JLDW_ZW>??</JLDW_ZW>
</dataset>
用了很多种网上说可以成功转换的办法没效,比如
char* ConvertUtf8ToGBK(const char *pszUtf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, pszUtf8, -1, NULL, 0);
unsigned short * wszGBK = new unsigned short[len + 1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, pszUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK = new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL, NULL);
return szGBK;
}
又比如
char * charxml=ConvertUtf8ToGBK( mystrcstyle);
wchar_t * unicode = new wchar_t[strlen(charxml) + 1];
mbstowcs_s(NULL, unicode, strlen(charxml) + 1, charxml, strlen(charxml));
int len_utf8 = WideCharToMultiByte(CP_UTF8,0,unicode,-1,NULL,0,NULL,NULL); //UINCODE=>UTF8需要的长度
char* utf8str = new char[len_utf8]; //分配空间存储最终结果
WideCharToMultiByte(CP_UTF8,0,unicode,-1,utf8str,len_utf8,NULL,NULL);
请大家注意,千万不要贴出的方法含有Cstring的MFC的代码,因为我是写DLL,含有MFC的方法不方便的,另外这个XML最终要转换成unsigned char *作为一个参数上传的,所以也不能转为wchar *,另外我也没有C++11的环境,所以网上提及可以用C++11 std::locale std::codecvt<> facet; 完美转换的方法对于我来说没用
------解决思路----------------------
1. 确定你xml本来的编码就是utf-8, 别标着utf-8, 却用GB编码
2. 步进跟踪, 反正tinyxml也不大
3. 推荐pugixml, MIT协议
------解决思路----------------------
问号和乱码是不一样的
乱码的字符内容还在那里,只是在当前编码环境里面显示出来是一些没有意义的字符,通过切换编码可以还原出有意义的内容。
问号是当前编码里面没有对应的符号,字符的内容已经真正的被转换成问号的 ASCII 码了,不可能再还原了。
------解决思路----------------------
你保存文件的代码是什么,贴出来瞅瞅,那些汉字是你在代码里手动输入的还是从别的地方解析来的
------解决思路----------------------
你说的这个乱码是在什么地方看到的
把它保存到txt文件中,然后用记事本打开看看正不正常
如果不做特殊处理,直接打印出来的话utf8格式的就是乱码
或者把<?xml version="1.0" encoding="utf-8" ?>里面的utf8改成gb2312
------解决思路----------------------
1. 首先你要确认一个问题, 是在哪里看到是乱码? 是在VS中看到, 还是在你的文本编辑器中看到?
VS中看到乱码可能是没有识别到编码类型, 如果是在文本编辑器中, 那就是文本编辑器没有识别到文本类型, 如notepad++, 你可以手动切换编码类型.
2. "作为unsigned char *作为一个参数上传" 谁说就一定要转换成unsigned char *类型? 这是你误解了这个类型的意义. 他的意思是上传只按字节传送, 你完全可以给个传wchar*, 只要计算好实际占用字节数即可, int *, WORD*, DWORD*等等任何数据类型都是可以放到unsigned char *作为参数的函数中, 因为他只关心按字节的内存, 不关心这个内存原来是什么类型.
------解决思路----------------------
CP_UTF8 属于 MultiBytes 所以要2次转换
1, 转到 UNICODE
2. 再转到 GB
------解决思路----------------------
lz你这个是从哪输入,输出到哪?
似乎是从你的程序编写XML,然后到外部乱码?
如果这样,保存的数据编码必须从多字节转换为UTF8(因为你的 <?xml version="1.0" encoding="utf-8" ?>此告诉文档的使用者,这个文档必须按UTF8读取),在程序内部,你无需做任何编码转换
------解决思路----------------------
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
------解决思路----------------------
utf8,写了utf8,不写bom头,或内容是gb的,当然会乱了。