用utf-8编码写入.xml文件,使得msxml可以成功加载xml文件进行解析
2015-12-29 15:36
471 查看
获取相机的设备描述文件.xml之后,需要对它进行解析,获取相关寄存器的信息。
于是利用微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component
Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++
Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
测试报错,装载文件失败。
于是用记事本打开.xml文件,选择编码utf-8另存为,发现load成功了。
于是就思考是否能在程序中,获取数据写入.xml文件的时候,就保存为UTF-8的xml文件
原始数据为char * buffer,数据长度int len,
1、将ASCI转换成Unicode
2、将Unicode转换成Utf-8
参考文章:/article/4656699.html
于是利用微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component
Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++
Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
<span style="font-size:18px;"><pre name="code" class="cpp">#include <iostream> using namespace std; #import <msxml4.dll> named_guids using namespace MSXML2; char* filename1 = "eco655MVGE_r2_v1.6.0_b2545.xml"; void myExit() { CoUninitialize(); } int main() { MSXML2::IXMLDOMDocumentPtr pDoc = NULL; //初始化COM CoInitialize(NULL); //创建解析器实例 HRESULT hr = pDoc.CreateInstance(MSXML2::CLSID_DOMDocument); if(FAILED(hr)) { cout<<"无法创建DOMDocument对象,请检查是否安装MSXML Parser运行库"<<endl; return EXIT_FAILURE; } //装载XML文档 variant_t vResult = pDoc->load(filename1); if((bool)vResult != TRUE) { cout<<"装载XML文件失败"<<endl; return EXIT_FAILURE; } //对XML文件解析的部分 pDoc = NULL; atexit(myExit); return EXIT_SUCCESS; }</span>
测试报错,装载文件失败。
于是用记事本打开.xml文件,选择编码utf-8另存为,发现load成功了。
于是就思考是否能在程序中,获取数据写入.xml文件的时候,就保存为UTF-8的xml文件
原始数据为char * buffer,数据长度int len,
bool WriteToXMLfile(const char * filename,char * buffer,DWORD len) { string s = buffer; wstring text = ANSIToUnicode(s); std::string outtext = UnicodeToUTF8(text); ofstream file(filename); // if(!file.good()) // return false; file.seekp(0,ios::beg); file.write(outtext.data(),outtext.size()); file.close(); return true; }
1、将ASCI转换成Unicode
<span style="font-size:18px;">wstring ANSIToUnicode(const string &str) { int len = 0; len = str.length(); int unicodeLen = ::MultiByteToWideChar( CP_ACP, 0, str.c_str(), -1, NULL, 0 ); wchar_t * pUnicode; pUnicode = new wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar( CP_ACP, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen ); wstring rt; rt = ( wchar_t* )pUnicode; delete pUnicode; return rt; }</span>
2、将Unicode转换成Utf-8
<span style="font-size:18px;">std::string UnicodeToUTF8(const std::wstring& wstr) { char *pText; int iTextLen; iTextLen = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); pText = new char[iTextLen+1]; memset((void*)pText,0,sizeof(char)*(iTextLen+1)); WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, pText, iTextLen, NULL, NULL); string str = pText; delete[] pText; return str; }</span>
参考文章:/article/4656699.html
相关文章推荐
- ObjectAnimator设置动画
- Java中的23种设计模式
- 4、字符、数字之间转换
- 中缀转后缀表达式
- c# propertyGrid下拉选项
- yii2.0 从控制器到视图的输出
- IE浏览器下POST中文乱码解决办法 - PHP实现
- MTK TP手势添加
- 安卓弹出对话框——Alertdialog(一)
- IOS 9人机界面指南(1)
- 【NanoPi2试用体验】编译系统
- git 自用
- java设计6大设计原则
- IOS开发 CABasicAnimation
- 从头认识java-15.5 使用LinkedHashSet需要注意的地方
- android 沉浸通知栏
- (2) 假设字符串类似这样的aba和aab就相等,现在随便给你二组字符串,请编程比较他们看是否相等
- 获取当前时间所在凌晨和23:59:59
- JAVA正则表达式:Pattern类与Matcher类详解(转)
- mysql 笔记