我创建一个小程序来读取文件,找到某个字符串,替换它,然后写一个新文件。这是我的代码。
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角色?
答案 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