现有一个UTF-8格式的XML文件,通过SAX方式进行解析,中文没问题,但有些特殊的符号会显示为问号(如x的3次方中的那个上标3就变成问号);
自己写生成XML文件的方法(由于种种原因,不采用现成XML解析器),要使生成的XML文件为UTF-8格式,但生成的中文,特殊符号好象不对。
各位,有没有谁碰到类似的问题?望赐教!关于XML文件的解析,生成问题

解决方案 »

  1.   

    编码问题,
    java内部用的Unicode,
    win用的GBK子集
      

  2.   

    //====下面是解析XML代码,其中LnTemplateSaxXmlReader  extends DefaultHandler
    SAXParserFactory sf = SAXParserFactory.newInstance();
    SAXParser sp = sf.newSAXParser();
    LnTemplateSaxXmlReader reader = new LnTemplateSaxXmlReader(this);
    InputSource is = new InputSource(new FileInputStream(fileName));
    // is.setEncoding("UTF-8");
    sp.parse(is, reader);
    //====== 写XML文件
    FileWriter writer = new FileWriter(fname);

    //写文件头
    writer.write(StringProcess.toUTF8("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));

    writer.write(StringProcess.toUTF8("<"));
    writer.write(StringProcess.toUTF8(Iec61850ConstDef.Name_DataTypeTemplates));
    writer.write(StringProcess.toUTF8(">\n"));

    //写LNodeType
    if (lnodeTypes.size() > 0)
         {
             for (LNodeType e : lnodeTypes)
             {
              writer.write(StringProcess.toUTF8(e.toStartXmlString()));
              writer.write(StringProcess.toUTF8("\n"));
             
              int doNum = e.getDONum();
             
              for(int i = 0; i < doNum; i ++)
              {
              writer.write(StringProcess.toUTF8(e.getDOByIndex(i).toXmlString()));
              writer.write(StringProcess.toUTF8("\n"));
              }
             
              writer.write(StringProcess.toUTF8(e.toEndXmlString()));
              writer.write(StringProcess.toUTF8("\n"));
             }
         }
    //=================================
    public static  String toUTF8(String str)

    System.out.println("=== src:" + str);
    if(str==null) str=""; 
    else 
    {
    try 

    str= new String(str.getBytes(),"UTF-8"); 

    catch (UnsupportedEncodingException e) 

    e.printStackTrace(); 

    }
    System.out.println("=== utf:" + str);
    return str;
      

  3.   

    XML文件片段:
    //=============用ultraEdit打开时:
    <EnumVal ord="23">掳C</EnumVal>
    <EnumVal ord="24">Sv</EnumVal>
    <EnumVal ord="25">F</EnumVal>
    <EnumVal ord="26">C</EnumVal>
    <EnumVal ord="27">S</EnumVal>
    <EnumVal ord="28">H</EnumVal>
    <EnumVal ord="29">V</EnumVal>
    <EnumVal ord="30">ohm</EnumVal>
    <EnumVal ord="31">J</EnumVal>
    <EnumVal ord="32">N</EnumVal>
    <EnumVal ord="33">Hz</EnumVal>
    <EnumVal ord="34">lx</EnumVal>
    <EnumVal ord="35">Lm</EnumVal>
    <EnumVal ord="36">Wb</EnumVal>
    <EnumVal ord="37">T</EnumVal>
    <EnumVal ord="38">W</EnumVal>
    <EnumVal ord="39">Pa</EnumVal>
    <EnumVal ord="41">m虏</EnumVal>
    <EnumVal ord="42">m鲁</EnumVal>
    <EnumVal ord="43">m/s</EnumVal>
    <EnumVal ord="44">m/s虏</EnumVal>
    <EnumVal ord="45">m鲁/s</EnumVal>
    <EnumVal ord="46">m/m鲁</EnumVal>
    <EnumVal ord="47">M</EnumVal>
    <EnumVal ord="48">kg/m鲁</EnumVal>
    <EnumVal ord="49">m虏/s</EnumVal>
    <EnumVal ord="50">W/m K</EnumVal>
    <EnumVal ord="51">J/K</EnumVal>
    <EnumVal ord="52">ppm</EnumVal>
    <EnumVal ord="53">1/s</EnumVal>
    <EnumVal ord="54">rad/s</EnumVal>
    <EnumVal ord="61">VA</EnumVal>
    <EnumVal ord="62">Watts</EnumVal>
    <EnumVal ord="63">VAr</EnumVal>
    <EnumVal ord="64">phi</EnumVal>
    <EnumVal ord="65">cos(phi)</EnumVal>
    <EnumVal ord="66">Vs</EnumVal>
    <EnumVal ord="67">V虏</EnumVal>
    <EnumVal ord="68">As</EnumVal>
    <EnumVal ord="69">A虏</EnumVal>
    <EnumVal ord="70">A虏t</EnumVal>
    <EnumVal ord="71">VAh</EnumVal>
    <EnumVal ord="72">Wh</EnumVal>
    <EnumVal ord="73">VArh</EnumVal>
    <EnumVal ord="74">V/Hz</EnumVal>//在ultraEdit中将xml由UTF-3转为ASCII时,所对应内容如下:(其中标红内容为上标,这些上标内容变成了问号)
    <EnumVal ord="23">°C</EnumVal>
    <EnumVal ord="24">Sv</EnumVal>
    <EnumVal ord="25">F</EnumVal>
    <EnumVal ord="26">C</EnumVal>
    <EnumVal ord="27">S</EnumVal>
    <EnumVal ord="28">H</EnumVal>
    <EnumVal ord="29">V</EnumVal>
    <EnumVal ord="30">ohm</EnumVal>
    <EnumVal ord="31">J</EnumVal>
    <EnumVal ord="32">N</EnumVal>
    <EnumVal ord="33">Hz</EnumVal>
    <EnumVal ord="34">lx</EnumVal>
    <EnumVal ord="35">Lm</EnumVal>
    <EnumVal ord="36">Wb</EnumVal>
    <EnumVal ord="37">T</EnumVal>
    <EnumVal ord="38">W</EnumVal>
    <EnumVal ord="39">Pa</EnumVal>
    <EnumVal ord="41">m2</EnumVal>
    <EnumVal ord="42">m3</EnumVal>
    <EnumVal ord="43">m/s</EnumVal>
    <EnumVal ord="44">m/s2</EnumVal>
    <EnumVal ord="45">m3/s</EnumVal>
    <EnumVal ord="46">m/m3</EnumVal>
    <EnumVal ord="47">M</EnumVal>
    <EnumVal ord="48">kg/m3</EnumVal>
    <EnumVal ord="49">m2/s</EnumVal>
    <EnumVal ord="50">W/m K</EnumVal>
    <EnumVal ord="51">J/K</EnumVal>
    <EnumVal ord="52">ppm</EnumVal>
    <EnumVal ord="53">1/s</EnumVal>
    <EnumVal ord="54">rad/s</EnumVal>
    <EnumVal ord="61">VA</EnumVal>
    <EnumVal ord="62">Watts</EnumVal>
    <EnumVal ord="63">VAr</EnumVal>
    <EnumVal ord="64">phi</EnumVal>
    <EnumVal ord="65">cos(phi)</EnumVal>
    <EnumVal ord="66">Vs</EnumVal>
    <EnumVal ord="67">V2</EnumVal>
    <EnumVal ord="68">As</EnumVal>
    <EnumVal ord="69">A2</EnumVal>
    <EnumVal ord="70">A2t</EnumVal>
    <EnumVal ord="71">VAh</EnumVal>
    <EnumVal ord="72">Wh</EnumVal>
    <EnumVal ord="73">VArh</EnumVal>
    <EnumVal ord="74">V/Hz</EnumVal>
      

  4.   

    Document document = DocumentHelper.createDocument();
    Element EnumVal = document.addElement("EnumVal ");
    EnumVal .addCDATA(str);//这个方法可以去掉特殊字符
      

  5.   


    现在情况是:加载解析XML文件时,特殊符号就变成问号了,另外生成XML文件方法自己写,不采用现成的XML解析器
      

  6.   

    结帖,原先思路偏了,局限到了怎么对字符串进行转换。
    采用下面方法即可
    java.io.FileOutputStream writerStream = new java.io.FileOutputStream(FileProcess.getTempPath(true) + ModelPubDef.FILE_substationXML); 
    writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(writerStream, "UTF-8")); 
    然后再写具体数据