具有特殊字符的读/写.text文件

时间:2011-01-04 19:53:02

标签: java android eclipse file-io character-encoding

我打开记事本(Windows)并编写

Some lines with special characters
Special: Žđšćč

并转到另存为... “someFile.txt”,编码设置为 UTF-8

在Java中我有

FileInputStream fis = new FileInputStream(new File("someFile.txt"));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {                         
    printLine(line);
}
in.close();

但我得到问号和类似的“特殊”字符。为什么呢?

编辑:我有此输入(.txt文件中的一行)

665,Žđšćč

和此代码

FileInputStream fis = new FileInputStream(new File(fileName));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

String line;
while((line = in.readLine()) != null) {
    Toast.makeText(mContext, line, Toast.LENGTH_LONG).show();

    Pattern p = Pattern.compile(",");
    String[] article = p.split(line);

    Toast.makeText(mContext, article[0], Toast.LENGTH_LONG).show();
    Toast.makeText(mContext, Integer.parseInt(article[0]), Toast.LENGTH_LONG).show();
}
in.close();

Toast 输出(对于那些不熟悉Android的人来说,Toast只是一种在屏幕上显示带有特定文本的弹出窗口的方法)很好。控制台显示“奇怪的字符”(可能是因为控制台窗口中的编码)。但它解析整数失败,因为控制台说这个(warning: toast output is just fine) - Problem

似乎字符串包含一些“怪异”字符,Toast无法显示/渲染,但是当我尝试解析它时,它会崩溃。建议?

如果我把Note放在NotePad中它可以工作(整数解析)并且没有如上图所示的怪异字符,但当然我的特殊字符不起作用。

6 个答案:

答案 0 :(得分:17)

这是不支持这些字符的输出控制台。由于您使用的是Eclipse,因此需要确保将其配置为使用UTF-8。你可以通过 Window>来做到这一点。偏好>一般>工作区>文本文件编码>设置为UTF-8

另见:


更新根据更新的问题和评论,显然UTF-8 BOM是罪魁祸首。记事本默认情况下会在保存时添加UTF-8 BOM。看起来HTC上的JRE并没有吞下它。您可能需要考虑在代码中使用this answer中列出的UnicodeReader示例,而不是InputStreamReader。它会自动检测并跳过BOM。

FileInputStream fis = new FileInputStream(new File(fileName));
UnicodeReader ur = new UnicodeReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(ur);

与实际问题无关,最好关闭finally块中的资源,以确保在异常情况下关闭它们。

BufferedReader reader = null;
try {
    reader = new BufferedReader(new UnicodeReader(new FileInputStream(fileName), "UTF-8"));
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

同样无关,我建议将Pattern p = Pattern.compile(",");放在循环之外,或者甚至使它成为静态常量,因为编译它的成本相对较高,而且每次循环内部都不需要这样做。

答案 1 :(得分:2)

您的代码看起来正确 - 但是一个非常常见且容易出错的错误是将屏幕上打印的内容误认为字符串中的内容。如果字符串尚未正确读取,请与调试器一起检查。

答案 2 :(得分:1)

记事本无法正确保存特殊符号。我遇到了类似的问题,我使用了Notepad ++,并从那里选择了UTf-8编码。当我这样做时,我的程序在应用String库方法时不再崩溃,这与我在记事本中创建文本文件不同。

答案 3 :(得分:0)

记事本可能无法处理非ascii字符。尝试其他文本编辑器。如果你想坚持使用windows install中的可用内容,请尝试使用wordpad。

答案 4 :(得分:0)

"Not all sequences of bytes are valid UTF-8."

http://en.wikipedia.org/wiki/UTF-8

在“无效字节序列”下的具体细节。

答案 5 :(得分:0)

您是否将转换中的字符用作servlet请求/响应的一部分? 如是, request.setEncoding("UTF-8")
 或
response.setCharacterEncoding("UTF-8")

应该解决你的目的。