0

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

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字符?

4

5 回答 5

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".

于 2013-06-25T12:43:11.183 回答
2

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

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

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

如果您使用真正的 XML 解析器,则需要自己实现编码嗅探(或者,如果您知道编码始终相同,则只需对编码进行硬编码)。

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

于 2013-06-25T12:43:00.120 回答
1

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

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

于 2013-06-25T12:44:41.893 回答
0

阅读您正在使用的 DEPRECATED DataInputStream.readLine() 方法的 javadoc。它会告诉您由于这个确切原因它已被弃用,并告诉您该怎么做。

于 2013-06-25T12:43:22.117 回答
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 转义来在文档中生成特殊字符。参考

于 2013-06-25T12:46:45.073 回答