• <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  評(píng)論-36  文章-0  trackbacks-0
            (寫(xiě)次筆記的目的除了對(duì)知識(shí)點(diǎn)進(jìn)行筆記外,還有就是希望能夠幫助和我一樣有遇到類似問(wèn)題的朋友。)

            剛接觸tinyxml時(shí),對(duì)于編碼問(wèn)題沒(méi)怎么注意,但就是這個(gè)沒(méi)有被我注意的問(wèn)題,在暗地里向我放“黑槍”,耗了我不少時(shí)間。

            現(xiàn)在就來(lái)說(shuō)說(shuō)我遇到的問(wèn)題,以及我的解決方法。

            如有不對(duì)的地方,懇請(qǐng)指正,小弟在這先謝謝了。

            對(duì)于如下代碼,
            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("測(cè)試"));
            ????pele
            ->LinkEndChild(psubele);
            ????doc.LinkEndChild(pele);

            ????doc.SaveFile(
            "test.xml");
            }

            生成的test.xml文件如果直接用IE查看,則會(huì)提示說(shuō)遇見(jiàn)無(wú)效字符。之所以這樣是因?yàn)椋?dāng)文件進(jìn)行保存時(shí),文件的實(shí)際編碼是ansi,而在ie進(jìn)行解讀時(shí)會(huì)根據(jù)聲明中指定的編碼utf-8來(lái)進(jìn)行解釋,對(duì)于英文字母來(lái)說(shuō)utf-8和ansi是兼容的,但因?yàn)槠渲杏袧h字,所以用utf-8來(lái)解釋編碼為ansi的漢字就會(huì)出現(xiàn)亂碼的問(wèn)題,從而使得ie提示說(shuō)遇見(jiàn)無(wú)效字符。

            而解決的方法是,將寫(xiě)入的中文字符串轉(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?=?"測(cè)試";
            ????
            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.:如果無(wú)所謂是否將xml文件顯示在瀏覽器中,下面的兩個(gè)問(wèn)題就不再那么重要了。

            但是,對(duì)寫(xiě)入的漢字進(jìn)行編碼轉(zhuǎn)換后又會(huì)帶來(lái)兩個(gè)問(wèn)題:
            第一個(gè),對(duì)于用utf-8編碼的xml文件,如果需要在控制臺(tái)中顯示xml中的漢字,則又得將utf-8轉(zhuǎn)為gb2312編碼,否則控制臺(tái)中將是一堆亂碼;
            第二個(gè),對(duì)于具有如下內(nèi)容的xml文件且文件實(shí)際編碼也為UTF8,
            <?xml?version="1.0"?encoding="utf-8"??>
            <ROOT>
            ????
            <名字>測(cè)試</名字>
            </ROOT>

            如果用如下所示的方法來(lái)讀取節(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è)自然是不同的(對(duì)電腦而言),進(jìn)而輸出error。
            解決辦法就是將find中的漢字“名字”轉(zhuǎn)為UTF8編碼即可,但是要想在控制臺(tái)中正確的輸出pchild->Value()中所包含的UTF8編碼的漢字,則又需要進(jìn)行轉(zhuǎn)換


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

            以上就是我個(gè)人的所遇到的問(wèn)題,以及解決方法。在其中如有不正確的說(shuō)法,懇請(qǐng)指正

            另:
            1. Write中用到的轉(zhuǎn)換函數(shù)iconv是第三方庫(kù),并非ms或標(biāo)準(zhǔn)庫(kù)自帶,有需要的朋友可以Google之。
            2. 要是全世界人民都用同一種語(yǔ)言,那該多好呀,會(huì)省了很多事,至于又會(huì)帶來(lái)什么問(wèn)題暫不考慮。
            posted on 2010-04-08 15:07 zhaoyg 閱讀(4798) 評(píng)論(0)  編輯 收藏 引用 所屬分類: other
            日韩精品国产自在久久现线拍 | 亚洲欧美日韩久久精品| 国内精品免费久久影院| 久久天天躁狠狠躁夜夜不卡| 久久久久久久久66精品片| 国产成人精品综合久久久| 国产精品久久久久久吹潮| 久久久久国产视频电影| 久久精品国产精品亚洲精品 | 久久久久国产| 久久久久99精品成人片试看 | 丁香色欲久久久久久综合网| 久久久精品午夜免费不卡| 亚洲人成电影网站久久| 青青草国产成人久久91网| 少妇精品久久久一区二区三区| 精品久久久久久无码国产| 99国产欧美精品久久久蜜芽| 手机看片久久高清国产日韩| .精品久久久麻豆国产精品| 国产aⅴ激情无码久久| 久久精品国产亚洲一区二区三区| 国内精品伊人久久久久av一坑| 亚洲欧美一区二区三区久久| 国产精品日韩欧美久久综合| 精品国产一区二区三区久久| 亚洲国产精品无码久久SM| 久久久久久精品免费看SSS| 精品欧美一区二区三区久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲精品无码久久久| 亚洲国产成人久久一区WWW| 久久久久99精品成人片| 久久精品亚洲欧美日韩久久| 91精品国产91久久久久久蜜臀| 国产精品一久久香蕉国产线看观看 | 精品国产VA久久久久久久冰| 欧美午夜精品久久久久免费视| 久久精品成人欧美大片| 亚洲精品乱码久久久久66| 色婷婷综合久久久久中文一区二区|