从文本文件中读取的字符错误

时间:2013-06-25 12:39:00

标签: java

我创建一个小程序来读取文件,找到某个字符串,替换它,然后写一个新文件。这是我的代码。

public static void main(String[] args) {
    String line;

    try {
        FileInputStream fstream = new FileInputStream("a.xml");
        BufferedInputStream bis = new BufferedInputStream(fstream);
        DataInputStream in = new DataInputStream(bis);

        Pattern p = Pattern.compile("someregex");

        StringBuilder content = new StringBuilder();
        while (in.available() != 0) {
            line = in.readLine();

            Matcher matcher = p.matcher(line);
            if (matcher.find()) {
                String filtered = matcher.group();
                int len = filtered.length() - 8;
                String city = filtered.substring(7, len);
                line = line.replaceAll("someregex", city);
                content.append(line).append("\n");
            } else {
                content.append(line).append("\n");
            }
        }

        in.close();

        BufferedWriter out = new BufferedWriter(new FileWriter("b.xml"));
        out.write(content.toString());
        out.close();
    } catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}

问题是该文件包含一些unicode字符,Java没有保留它。我有这句话:“可爱的参观槟城的东方和东方”。 Java将其写成“可爱的槟城东方和东方之旅”。如何保留unicode角色?

5 个答案:

答案 0 :(得分:3)

你必须使用InputStreamReader。有几种方法可以做到这一点,但这里有一个:http://docs.oracle.com/javase/tutorial/i18n/text/stream.html

他们的例子是:

FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF8");

编辑:正如Joop在评论中所建议的那样,应该使用现代版本,所以"UTF-8"

答案 1 :(得分:2)

如果要以有意义的方式处理文件的文本内容,则必须指定文件的编码。这意味着您必须知道文件的编码。

幸运的是,XML格式的指定方式始终可以告诉(正确的)XML文件的编码。

因此,如果您使用真正的XML解析器库来处理XML,那么这将自动完成。

如果使用真正的XML解析器,则需要自己实现the encoding sniffing(或者如果您知道它总是相同的话,只需对编码进行硬编码)。< / p>

作为一般规则,每当您想要将byte[](包括文件内容!)转换为String时,您需要知道byte[]的正确编码}。

答案 2 :(得分:1)

  

如何在Java中保留Unicode?   问题是该文件包含一些unicode字符,Java没有保留它。

Java使用Unicode字符集。文件不能“包含Unicode”;它可以包含Unicode字符集的编码的字节。您的问题将是因为文件的编码以及您在读取文件时告诉Java使用的编码不完全相同。

答案 3 :(得分:0)

在您正在使用的DEPRECATED DataInputStream.readLine()方法上读取javadoc。它告诉你,出于这个原因,它已被弃用,并告诉你该怎么做。

答案 4 :(得分:0)

所有Unicode字符都可以在java中的注释,字符和字符串文字中使用。 Unicode字符可以通过Unicode转义序列表示。

Unicode转义序列由

组成

反斜杠'\'(ASCII字符92,十六进制0x5c), 'u'(ASCII 117,十六进制0x75) 可选地包含一个或多个“u”字符,以及 四个十六进制数字(字符'0'到'9'或'a'到'f'或'A'到'F')。 此类序列表示Unicode字符的UTF-16编码,例如,“a”等同于“\ u0061”。此转义方法不支持U + FFFF以外的字符,或者您必须使用代理项对。

Unicode转义序列可能出现在Java源文件中的任何位置,包括内部标识符,注释和字符串文字。 Unicode转义必须始终格式良好,即使它们出现在注释中,否则编译器会抱怨。在注释中放置格式良好的Unicode转义符是合法的。程序员有时在Javadoc注释中使用Unicode转义符来在文档中生成特殊字符。 REFER