使用特殊字符读/写.txt文件

sve*_*ija 9 java eclipse file-io android character-encoding

我打开记事本(Windows)并写

Some lines with special characters
Special: Ž?š??
Run Code Online (Sandbox Code Playgroud)

并转到另存为... "someFile.txt",其中Encoding设置为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();
Run Code Online (Sandbox Code Playgroud)

但我得到问号和类似的"特殊"字符.为什么?

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

665,Ž?š??
Run Code Online (Sandbox Code Playgroud)

和这段代码

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();
Run Code Online (Sandbox Code Playgroud)

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

似乎String包含一些"奇怪"的字符,Toast无法显示/渲染,但是当我尝试解析它时,它会崩溃.建议?

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

Bal*_*usC 17

它是输出控制台,不支持这些字符.由于您使用的是Eclipse,因此需要确保将其配置为使用UTF-8.您可以通过Window> Preferences> General> Workspace> Text File Encoding>设置为UTF-8来完成此操作.

也可以看看:


更新按照更新的问题和意见,显然是UTF-8 BOM是罪魁祸首.记事本默认情况下会在保存时添加UTF-8 BOM.看起来HTC上的JRE并没有吞下它.您可能需要考虑使用此答案中UnicodeReader概述的示例而不是代码中的示例.它会自动检测并跳过BOM.InputStreamReader

FileInputStream fis = new FileInputStream(new File(fileName));
UnicodeReader ur = new UnicodeReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(ur);
Run Code Online (Sandbox Code Playgroud)

与实际问题无关,在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) {}
}
Run Code Online (Sandbox Code Playgroud)

同样无关,我建议把它放在Pattern p = Pattern.compile(",");循环之外,或者甚至把它变成一个静态常量,因为它编译起来相对昂贵而且每次在循环中都不需要这样做.