tinyxml的使用和字符编码转换
来源:互联网 发布:php 记log日志 编辑:程序博客网 时间:2024/06/06 01:13
2012-01-11 13:10:00
标签:ansi xml tinyxml使用 tinyxml编码 tinyxml ansi格式保存xml
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jetyi.blog.51cto.com/1460128/761708
tinyxml定义的类或函数中涉及的字符大都是char,字符串指针也是char*或const char*,看一下面几个函数:
const char* TiXmlElement::Attribute( const char* name ) const
int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const
...
这样在你的应用程序中获取的字符串就是const char*类型,如果你的XML文档指定是UTF-8编码(注意保存的时候也是以UTF-8编码方式保存的),例如:
<?xml version="1.0" encoding="UTF-8">
<root>
<item>中文字符</item>
</root>
而你的应用程序可能是UNICODE,也可能是多字节,那么在应用程序中会这样读xml文档:
TiXmlDocument doc("UTF8test.xml");
doc.LoadFile(TIXML_DEFAULT_ENCODING);//TIXML_DEFAULT_ENCODING指明按照UTF-8编码方式读取xml文档
TiXmlElement* root = doc.RootElement();
TiXmlNode* node = root->FirstChild("item");
TiXmlElement* element = node->ToElement();
const char* text = element->GetText();
要注意此时的text,它指向的内存保存的数据是一个char类型的字符,以0结尾,如果你将其直接输出得到的将是乱码,它的内容如下:
e4 b8 ad e6 96 87 e5 ad 97 e7 ac a6 00
这一串数据是保存在文件中的UTF-8编码,它们是多字节字符.
将其转换为宽字符(宽字符的意思是:UNICODE 字符在内存中是以"UNICODE字符集中的序号"存在).
WCHAR wtext[MAX_PATH] = {0};
MultiByteToWideChar(CP_UTF8, 0, text, -1, wtext, MAX_PATH);
再看看wtext中的内容: 2d 4e 87 65 57 5b 26 7b 00 00
这是在内存中存放的UTF-8字符编码的序号(UNICODE字符字符内存中存放的是其序号而不是其编码).
再将wtext转换为多字符(CP_ACP方式编码) :
char sztext[MAX_PATH] = {0};
WideCharToMultiByte(CP_ACP, 0, wtext, -1, sztext, MAX_PATH, NULL, NULL);
再看看sztext中的内容: d6 d0 ce c4 d7 d6 b7 fb 00
可以看到,text,wtext,sztext指向内存中的数据并不相同.
还有一点,如果text中的内容是ASII吗,你就不用转换了,可以直接拿来使用.
在内存中动态生成XML文件时,仍然是ANSI编码方式,如下面代码.
- TiXmlDocument* m_pTinXMLDoc = new TiXmlDocument;
- TiXmlDeclaration* pdecl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
- m_pTinXMLDoc->LinkEndChild(pdecl); // <?xml version="1.0" encoding="UTF-8"?>
- // <TransmitInfo datetime="2012-10-10 19:10:23" cmd="1" category="">
- TiXmlElement* pEleRoot = new TiXmlElement("RootNode");
- pEleRoot->SetAttribute("id", "这是中文");
- TiXmlElement* pNode = new TiXmlElement("中文标签");
pNode->SetAttribute("中文属性", "属性值");- pEleRoot->LinkEndChild(pNode);
- m_pTinXMLDoc->LinkEndChild(pEleRoot);
- m_pTinXMLDoc->SaveFile("e:\\testansi.xml");
- TiXmlPrinter printer;
- m_pTinXMLDoc->Accept(&printer);
- int nxmlBytes = printer.Size();
- const char* xmlcstr = printer.CStr();
- ASSERT(strlen(xmlcstr)==nxmlBytes && nxmlBytes<nLen);
- //将xmlcstr转换为utf-8
- //...略.
0 0
- tinyxml的使用和字符编码转换
- 字符编码的使用和转换
- 字符编码的使用和转换(zhuan)
- C+++Utf8字符转换Gb2312编码,解决TinyXml中文乱码
- 在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件
- mb_convert_encoding 函数的使用 转换字符编码
- 封装tinyxml实现对UTF8和UNICODE编码格式转换
- TinyXML的编译和使用
- tinyxml的安装和使用
- 字符编码和python使用encode,decode转换utf-8, gbk, gb2312的问题
- 字符编码、字符存储、字符转换及工程中字符的使用
- 字符编码之间的转换
- QT的字符编码转换 .
- 字符编码的转换iconv
- QT的字符编码转换
- PHP 转换字符的编码
- 字符编码之间的转换
- c#实现GB2312和UTF8字符编码方式的转换!
- 第七周 项目2-建立链队算法库
- 设置界面的显示时间
- 第六周项目二建立链栈算法库
- DZN 占位图
- 第9周 项目2-对称矩阵压缩存储的实现与应用(1)
- tinyxml的使用和字符编码转换
- java 代理模式 详解(奶粉代购例子)
- 3D Touch 第二弹
- SQ 数据库归档
- eclipse快捷键
- Windows 10 专业版关闭自动更新
- 第八周项目5—计数的模式匹配
- C++之tinyXML使用
- C,C++宏中#与##的讲解