文件中写入了异常字符
Abnormal Characters has been written into the file
private static void write(String x, File file)
throws FileNotFoundException, IOException {
StringTokenizer tokenizer = new StringTokenizer(x) ;
FileOutputStream fop = new FileOutputStream(file, true);
while (tokenizer.hasMoreTokens()) {
fop.write(tokenizer.nextToken().toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
}
}
关于上面的代码,我在我的代码中调用了这个函数,当某些条件成立时写一些字。但是,有时我会遇到一些奇怪的字符,例如â€
、sé
等,请问如何才能不让这些东西出现呢?
为了将 "characters" 存储在文件中,您必须将它们转换为字节序列。你可以像你一样直接使用getBytes()
,或者你可以使用流编写器为你做这些。
遗憾的是,有许多不同的方式来表示重音字符和原始 ASCII 集之外的其他字符。 getBytes()
在您的代码中 returns 一种这样的表示,基于您的系统默认编码。
当您看到奇怪的字符时,并不是文件有问题,而是您正在使用不同的编码读取文件。
您需要知道要在输出中查找什么编码,然后您可以告诉 getBytes()
生成该编码。例如:
fop.write(tokenizer.nextToken().toLowerCase().getBytes("Windows-1252"));
现在 String.getBytes()
使用默认编码,该编码可能会在每个平台上发生变化。
您可以使用 getBytes(charset)
,但更简单的是使用执行字符串而不是字节的 Writer。
可以为所有后续写入为 OutputStreamWriter 指定一次编码。
StringTokenizer tokenizer = new StringTokenizer(x) ;
try (PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file, true),
"UTF-8")))) {
while (tokenizer.hasMoreTokens()) {
out.println(tokenizer.nextToken().toLowerCase());
}
}
对于 Windows Latin-1 或其他东西,您可能更喜欢 "Windows-1252"
。 UTF-8 的优点是能够结合所有脚本,西里尔文、希腊文、阿拉伯文。
private static void write(String x, File file)
throws FileNotFoundException, IOException {
StringTokenizer tokenizer = new StringTokenizer(x) ;
FileOutputStream fop = new FileOutputStream(file, true);
while (tokenizer.hasMoreTokens()) {
fop.write(tokenizer.nextToken().toLowerCase().getBytes());
fop.write(System.getProperty("line.separator").getBytes());
}
}
关于上面的代码,我在我的代码中调用了这个函数,当某些条件成立时写一些字。但是,有时我会遇到一些奇怪的字符,例如â€
、sé
等,请问如何才能不让这些东西出现呢?
为了将 "characters" 存储在文件中,您必须将它们转换为字节序列。你可以像你一样直接使用getBytes()
,或者你可以使用流编写器为你做这些。
遗憾的是,有许多不同的方式来表示重音字符和原始 ASCII 集之外的其他字符。 getBytes()
在您的代码中 returns 一种这样的表示,基于您的系统默认编码。
当您看到奇怪的字符时,并不是文件有问题,而是您正在使用不同的编码读取文件。
您需要知道要在输出中查找什么编码,然后您可以告诉 getBytes()
生成该编码。例如:
fop.write(tokenizer.nextToken().toLowerCase().getBytes("Windows-1252"));
现在 String.getBytes()
使用默认编码,该编码可能会在每个平台上发生变化。
您可以使用 getBytes(charset)
,但更简单的是使用执行字符串而不是字节的 Writer。
可以为所有后续写入为 OutputStreamWriter 指定一次编码。
StringTokenizer tokenizer = new StringTokenizer(x) ;
try (PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(file, true),
"UTF-8")))) {
while (tokenizer.hasMoreTokens()) {
out.println(tokenizer.nextToken().toLowerCase());
}
}
对于 Windows Latin-1 或其他东西,您可能更喜欢 "Windows-1252"
。 UTF-8 的优点是能够结合所有脚本,西里尔文、希腊文、阿拉伯文。