• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-59  評論-36  文章-0  trackbacks-0
            (寫次筆記的目的除了對知識點進行筆記外,還有就是希望能夠幫助和我一樣有遇到類似問題的朋友。)

            剛接觸tinyxml時,對于編碼問題沒怎么注意,但就是這個沒有被我注意的問題,在暗地里向我放“黑槍”,耗了我不少時間。

            現在就來說說我遇到的問題,以及我的解決方法。

            如有不對的地方,懇請指正,小弟在這先謝謝了。

            對于如下代碼,
            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查看,則會提示說遇見無效字符。之所以這樣是因為,當文件進行保存時,文件的實際編碼是ansi,而在ie進行解讀時會根據聲明中指定的編碼utf-8來進行解釋,對于英文字母來說utf-8和ansi是兼容的,但因為其中有漢字,所以用utf-8來解釋編碼為ansi的漢字就會出現亂碼的問題,從而使得ie提示說遇見無效字符。

            而解決的方法是,將寫入的中文字符串轉為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字符集轉換為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");
            }
            進行轉換之后,就可以在IE中顯示xml文件內容了。

            P.S.:如果無所謂是否將xml文件顯示在瀏覽器中,下面的兩個問題就不再那么重要了。

            但是,對寫入的漢字進行編碼轉換后又會帶來兩個問題:
            第一個,對于用utf-8編碼的xml文件,如果需要在控制臺中顯示xml中的漢字,則又得將utf-8轉為gb2312編碼,否則控制臺中將是一堆亂碼;
            第二個,對于具有如下內容的xml文件且文件實際編碼也為UTF8,
            <?xml?version="1.0"?encoding="utf-8"??>
            <ROOT>
            ????
            <名字>測試</名字>
            </ROOT>

            如果用如下所示的方法來讀取節點“名字”,只會輸出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;
            }
            因為函數find中的"名字"并不是UTF8編碼,"名字"的實際編碼可能是ANSI編碼(我也不敢確定),所以xml文件中以UTF8進行編碼的“名字”和find函數中以非UTF8編碼的“名字”這兩個自然是不同的(對電腦而言),進而輸出error。
            解決辦法就是將find中的漢字“名字”轉為UTF8編碼即可,但是要想在控制臺中正確的輸出pchild->Value()中所包含的UTF8編碼的漢字,則又需要進行轉換


            還有一種方法,或者說是徹底的方法,就是直接將xml聲明中的編碼改為gb2312,這樣一來就輕松很多,基本上上面所說的問題都不會存在了。

            以上就是我個人的所遇到的問題,以及解決方法。在其中如有不正確的說法,懇請指正

            另:
            1. Write中用到的轉換函數iconv是第三方庫,并非ms或標準庫自帶,有需要的朋友可以Google之。
            2. 要是全世界人民都用同一種語言,那該多好呀,會省了很多事,至于又會帶來什么問題暫不考慮。
            posted on 2010-04-08 15:07 zhaoyg 閱讀(4777) 評論(0)  編輯 收藏 引用 所屬分類: other
            亚洲伊人久久综合中文成人网| 无码专区久久综合久中文字幕| 久久精品国产精品国产精品污| 国产日产久久高清欧美一区| 久久综合五月丁香久久激情| 亚洲AV无码久久精品色欲| 国内精品久久久久久麻豆| 久久AV无码精品人妻糸列| 久久精品国产久精国产| 国产精品乱码久久久久久软件| 久久综合亚洲欧美成人| 久久www免费人成看国产片| 久久国产亚洲精品无码| 无码乱码观看精品久久| 欧美综合天天夜夜久久| 亚洲AV无码久久精品狠狠爱浪潮| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久影视综合亚洲| 久久国产精品99精品国产987| 无码任你躁久久久久久老妇App| 久久99热国产这有精品| 亚洲AV无码成人网站久久精品大| 人人狠狠综合久久亚洲| 国内精品免费久久影院| 亚洲精品高清国产一久久| 久久99国产综合精品| 久久国产色AV免费看| 婷婷综合久久中文字幕蜜桃三电影| 亚洲综合久久久| 一本一道久久a久久精品综合| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久久久国产一级毛片高清版| 狠狠88综合久久久久综合网| 中文无码久久精品| 无码人妻精品一区二区三区久久| 欧美亚洲国产精品久久久久| 狠狠色丁香久久婷婷综合蜜芽五月| 欧美久久久久久精选9999| 久久久久综合中文字幕 | 成人免费网站久久久| 99久久精品国产麻豆|