(寫次筆記的目的除了對知識(shí)點(diǎn)進(jìn)行筆記外,還有就是希望能夠幫助和我一樣有遇到類似問題的朋友。)
剛接觸tinyxml時(shí),對于編碼問題沒怎么注意,但就是這個(gè)沒有被我注意的問題,在暗地里向我放“黑槍”,耗了我不少時(shí)間。
現(xiàn)在就來說說我遇到的問題,以及我的解決方法。
如有不對的地方,
懇請指正,小弟在這先謝謝了。
對于如下代碼,
void?Write()
{
????TiXmlDocument?doc?;
????doc.LinkEndChild(new?TiXmlDeclaration("1.0"?,?"utf-8",""));
????TiXmlElement?*pele?=?new?TiXmlElement("ROOT");
????TiXmlElement?*psubele?=?new?TiXmlElement("First-element");
????psubele->LinkEndChild(new?TiXmlText("測試"));
????pele->LinkEndChild(psubele);
????doc.LinkEndChild(pele);
????doc.SaveFile("test.xml");
}
生成的test.xml文件如果直接用IE查看,則會(huì)提示說遇見無效字符。之所以這樣是因?yàn)椋?dāng)文件進(jìn)行保存時(shí),文件的實(shí)際編碼是ansi,而在ie進(jìn)行解讀時(shí)會(huì)根據(jù)聲明中指定的編碼utf-8來進(jìn)行解釋,對于英文字母來說utf-8和ansi是兼容的,但因?yàn)槠渲杏袧h字,所以用utf-8來解釋編碼為ansi的漢字就會(huì)出現(xiàn)亂碼的問題,從而使得ie提示說遇見無效字符。
而解決的方法是,將寫入的中文字符串轉(zhuǎn)為utf-8編碼
void?Write()
{
????TiXmlDocument?doc?;
????doc.LinkEndChild(new?TiXmlDeclaration("1.0"?,?"utf-8",""));
????TiXmlElement?*pele?=?new?TiXmlElement("ROOT");
????TiXmlElement?*psubele?=?new?TiXmlElement("First-element");
????const?char????*src?=?"測試";
????char????????dst[100]?=?{0};
????size_t????????src_len?=?strlen(src);
????size_t????????dst_len?=?sizeof(dst);
????const?char????*in?=?src;
????char????????*out?=?dst;
????iconv_t????????cd;
????/*?將GB2312字符集轉(zhuǎn)換為UTF-8字符集?*/
????cd?=?iconv_open("UTF-8","GB2312"?);?
????if?((iconv_t)-1?==?cd)
????{
????????return?;
????}
????iconv(cd,?&in,?&src_len,?&out,?&dst_len);
????iconv_close(cd);
????psubele->LinkEndChild(new?TiXmlText(dst));
????pele->LinkEndChild(psubele);
????doc.LinkEndChild(pele);
????doc.SaveFile("test.xml");
}
進(jìn)行轉(zhuǎn)換之后,就可以在IE中顯示xml文件內(nèi)容了。
P.S.:如果無所謂是否將xml文件顯示在瀏覽器中,下面的兩個(gè)問題就不再那么重要了。
但是,對寫入的漢字進(jìn)行編碼轉(zhuǎn)換后又會(huì)帶來兩個(gè)問題:
第一個(gè),對于用utf-8編碼的xml文件,如果需要在控制臺(tái)中顯示xml中的漢字,則又得將utf-8轉(zhuǎn)為gb2312編碼,否則控制臺(tái)中將是一堆亂碼;
第二個(gè),對于具有如下內(nèi)容的xml文件且文件實(shí)際編碼也為UTF8,
<?xml?version="1.0"?encoding="utf-8"??>
<ROOT>
????<名字>測試</名字>
</ROOT>
如果用如下所示的方法來讀取節(jié)點(diǎn)“名字”,只會(huì)輸出error字樣,而不是“名字”。
void?find()
{
????TiXmlDocument?doc;
????doc.LoadFile("test.xml");
????TiXmlElement?*pEle?=?doc.RootElement();
????TiXmlElement?*pchild?=?pEle->FirstChildElement("名字");
????if?(!pchild)
????{
????????cout?<<?"error"<<endl;
????????return?;
????}
????cout<<pchild->Value()<<endl;
}
因?yàn)楹瘮?shù)find中的"名字"并不是UTF8編碼,"名字"的實(shí)際編碼可能是ANSI編碼(我也不敢確定),所以xml文件中以UTF8進(jìn)行編碼的“名字”和find函數(shù)中以非UTF8編碼的“名字”這兩個(gè)自然是不同的(對電腦而言),進(jìn)而輸出error。
解決辦法就是將find中的漢字“名字”轉(zhuǎn)為UTF8編碼即可,但是要想在控制臺(tái)中正確的輸出pchild->Value()中所包含的UTF8編碼的漢字,則又需要進(jìn)行轉(zhuǎn)換

。
還有一種方法,或者說是徹底的方法,就是直接將xml聲明中的編碼改為gb2312,這樣一來就輕松很多,基本上上面所說的問題都不會(huì)存在了。
以上就是我個(gè)人的所遇到的問題,以及解決方法。在其中如有不正確的說法,
懇請指正。
另:
1. Write中用到的轉(zhuǎn)換函數(shù)iconv是第三方庫,并非ms或標(biāo)準(zhǔn)庫自帶,有需要的朋友可以Google之。
2. 要是全世界人民都用同一種語言,那該多好呀,會(huì)省了很多事,至于又會(huì)帶來什么問題暫不考慮。
posted on 2010-04-08 15:07
zhaoyg 閱讀(4777)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
other