我有个文件,内容是xml格式的。但是可气的是文件本身是ANSI的,却不是UTF-8编码。
所以我用DOM4J来导入就有问题。
请问,如何将文件解析成UTF-8的编码呢?
多谢了!~

解决方案 »

  1.   


    我博客上有个private static void transferFile(String srcFileName, String destFileName) throws IOException {
      String line_separator = System.getProperty("line.separator"); 
      FileInputStream fis = new FileInputStream(srcFileName);
      StringBuffer content = new StringBuffer();
      DataInputStream in = new DataInputStream(fis);
      BufferedReader d = new BufferedReader(new InputStreamReader(in, "GBK"));// , "UTF-8"  
      String line = null;
      while ((line = d.readLine()) != null)
       content.append(line + line_separator);
      d.close();
      in.close();
      fis.close();
          
      Writer ow = new OutputStreamWriter(new FileOutputStream(destFileName), "utf-8");
      ow.write(content.toString());
      ow.close();
     }将一个GBK编码的文件转成UTF8 编码的文件,有兴趣的话,你可以试下不知道为什么, 用 ultraEdit 以二进制查看生成的文件时,文件头部并没有以 EF BB BF 开头,但是以  windows  记事本打开后,另存为,可以发现其为 utf8 的. 我的 eclipse 的工作区的编码是 utf-8的,转换前,打开A.java 是乱码,转换后就可以正常显示了.
    如果你觉得有什么问题,可以联系我,一起讨论下.....//参考了 字符,字节和编码 http://www.regexlab.com/zh/encoding.htm................
      

  2.   

    如果就一个文件,你就另存为utf-8好了.佛曰:
    不知道为什么, 用 ultraEdit 以二进制查看生成的文件时,文件头部并没有以 EF BB BF 开头,但是以  windows  记事本打开后,另存为,可以发现其为 utf8 的. 我的 eclipse 的工作区的编码是 utf-8的,转换前,打开A.java 是乱码,转换后就可以正常显示了.你没有往头部写EF BB BF,当然没有了.
      

  3.   

    bom似乎是 windows 相关软件特有的样的,试试 eclipse 存成 utf8 文件, 好像没有这些前缀
      

  4.   

    用PilotEdit 2.6,可以一次转换多个文件。http://topic.csdn.net/u/20090617/22/3b4e465d-c2cd-426d-9532-9865cdee8577.html
      

  5.   


    private String toUTF8(String s) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (c >= 0 && c <= 255) {
    sb.append(c);
    } else {
    byte[] b;
    try {
    b = Character.toString(c).getBytes("UTF-8");
    } catch (Exception e) {
    e.printStackTrace();
    b = new byte[0];
    }
    for (int j = 0; j < b.length; j++) {
    int k = b[j];
    if (k < 0)
    k += 256;
    sb.append("%" + Integer.toHexString(k).toUpperCase());
    }
    }
    }
    return sb.toString();
    }用这个方法不知道行不行,你看看,我一直用这个,
      

  6.   

    谢谢楼上的各位了,我的意思是这样的。
    我读入的是ANSI字符集的文件,读这个文件用SAXReader来 read的话是报错的。只有将文件改成UTF-8字符集来读才没有错误。
    我希望通过代码来自动转换解决。
    我也想到了一个办法,就是在我读入ANSI字符集文件时,再转换生成一个UTF-8字符集的文件,然后再读这个文件进行解析。不过这个办法太麻烦了。
    请问有没有更简便一些的办法?这个和BOM有关系的吧?
    多谢了~我会加分的
      

  7.   

    我查到了ANSI文件前三个字节是60、63、120对应的是0x3C 、0x3F 、0x78。
    是不是修改了流中的这三个,改为0xFE、0xBF、0xFF 就可以了?
      

  8.   

    首先请注意:SaxReader是能读的。方法如下:
    SAXReader r = new SAXReader();
    Document doc = r.read(new InputStreamReader(new FileInputStream(new File("yourfile")),"gbk"));
    其次,如果你要转换,也要使用InputStreamReader和OutputStreamWriter,请自行查阅这两个类的javadoc
      

  9.   

    InputStreamReader和OutputStreamWriter
    那是不是转换只能先生成一个文件,然后再读?就像我上面说的那种方法?是不是很麻烦啊?
      

  10.   

    InputStream ifile = null;
    ifile = new FileInputStream(handleFile); 
    document = reader.read(this.getBOMEncodingStream(ifile));protected  InputStreamReader getBOMEncodingStream(InputStream is) throws IOException {
    InputStream backIs = is;         String sb = ""; 
             ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
            
                while (backIs.read(bytesArry) != -1) {   
                    arrayOutputStream.write(bytesArry);
                }   
                arrayOutputStream.close();
                bytesArry = arrayOutputStream.toByteArray();
                sb = new String(bytesArry,"GBK");            InputStream tarIs = new ByteArrayInputStream(sb.getBytes("UTF-8"));            return new InputStreamReader(tarIs,"UTF-8");
            }
            backIs.close();
            return new InputStreamReader(backIs,"UTF-8");
        }这是我的这段处理代码,执行了下面的函数,当执行reader.read()时,就报错了。内容如下:
    An invalid XML character (Unicode: 0xbc) was found in the element content of the document. Nested exception: An invalid XML character (Unicode: 0xbc) was found in the element content of the document.
      

  11.   


    你的意思是想读文件后,要先判断是否是 utf8,不是就转, 再读,是吗?
      

  12.   

    你可以去下载UltraLrcEditor编辑器,可以将编码转为utf—8的
    我试过了很好用
      

  13.   

    用一些二进制软件转换,比如UltraLrcEditor
      

  14.   

    20l,你瞎叹什么啊,一个SB。
      

  15.   

    1.用程序按ansi一行一行的读取
    2.然后再一行一行的以utf-8格式输出到另一文件
    3.将源文件删除
      

  16.   


    '4 UTF编码'UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:'UCS-2编码(16进制) UTF-8 字节流(二进制)'0000 - 007F 0xxxxxxx
    '0080 - 07FF 110xxxxx 10xxxxxx
    '0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
    '例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,
    '所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。'
    '将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,
    '得到:11100110 10110001 10001001,即E6 B1 89。'读者可以用记事本测试一下我们的编码是否正确?
    'UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
    'UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示;
    '00000080-000007FF的字符用两个字节表示
    '00000800-0000FFFF的字符用3字节表示
    Function ByteStreamtoUTF8String(para_1() As Byte) As String
        '功能:字节流转为字符串
        '参数说明:para_1为需转换的字节流
        Dim iLoop     As Long
        Dim jj As Currency
        Dim tempstring     As String
        Dim lngstring     As Long
        
        On Error Resume Next
        For iLoop = 0 To UBound(para_1)
                '遍历转换字节流
                
                If para_1(iLoop) > 0 And para_1(iLoop) <= 127 Then
                        '如果是ASCII
                        tempstring = tempstring & Chr(para_1(iLoop))                                                      '得到ASCII表示的字符
                ElseIf para_1(iLoop) >= 128 And para_1(iLoop) <= 223 Then
                        '如果是汉字
                        lngstring = ((CInt(para_1(iLoop)) - 128#) * 64#)                                              '计算高位
                        iLoop = iLoop + 1
                        lngstring = lngstring + para_1(iLoop) - 128#                                                              '计算低位
                        tempstring = tempstring & ChrW(lngstring) '得到汉字
                ElseIf para_1(iLoop) >= 224 Then
                        '如果是汉字
                        lngstring = ((CInt(para_1(iLoop)) - 224#) * 4096#)
                        iLoop = iLoop + 1
                        lngstring = lngstring + ((CInt(para_1(iLoop)) - 128#) * 64#)                                           '计算高位
                        iLoop = iLoop + 1
                        lngstring = lngstring + para_1(iLoop) - 128#                                                  '计算低位
                        tempstring = tempstring & ChrW(lngstring) '得到汉字
                End If
        Next
        tempstring = CStr(tempstring)
       ByteStreamtoUTF8String = tempstring
       
        'main.errmessage   =   New   frmerrmessage("程序出现异常,无法正常运行!",   "错误编码:A00031")
        'main.errmessage.ShowDialog()
        Exit FunctionEnd Function
      

  17.   

    读取源文件并生成另一个utf-8的文件行不行?
      

  18.   


    windows会尝试各种可能,并以他认为最恰当的方法来处理,如果一个文件是utf8的,却没有bom单身汉,用ansi方式来判断,会出来大量非本地字符,比如出来阿拉伯文字符,这就可能导致记事本换成utf8方式来处理。
      

  19.   


    你好,我也想过这么做。但是这样很麻烦,而且我要保持源文件的样子,不能随意改它的字符集。如果先处理成一个UTF8的文件,再对这个文件进行处理,是没有问题的。但是这样很麻烦。我想直接在内存中处理完成。
      

  20.   


    你看下这个思路怎么样, (在 windows下应该可行,但在 linux 就不清楚了,而且 ansi 文件要有 bom 标识)
    先读取相应的 xml 文件, 然后通过 bom 来判断是不是 utf8,如果不是, 就按我提供的那种方式(3楼),将其转成 utf8, 保存后面的你再完成吧