有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java读/写。具有特殊字符的txt文件

我打开记事本(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无法显示/呈现的“奇怪”字符,但当我试图解析它时,它崩溃了。建议

如果我把ANSI放在记事本中,它可以工作(整数解析),并且没有像上图中那样的奇怪字符,但是我的特殊字符当然不能工作


共 (6) 个答案

  1. # 2 楼答案

    输出控制台不支持这些字符。由于您使用的是Eclipse,因此需要确保将其配置为为此使用UTF-8。您可以通过窗口>;偏好>;通用>;工作空间>;文本文件编码>;设置为UTF-8

    另请参见:


    更新根据更新的问题和评论,显然UTF-8 BOM是罪魁祸首。默认情况下,记事本会在保存时添加UTF-8 BOM表。看起来你的HTC上的JRE并没有接受这一点。您可能需要考虑使用^ {CD1> }示例,如代码中的{a3},而不是^ {

    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(",");放在循环之外,甚至把它变成一个静态常量,因为编译它的成本相对较高,并且没有必要每次都在循环中这样做

  2. # 3 楼答案

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

  3. # 4 楼答案

    记事本可能无法处理非ascii字符。尝试另一个文本编辑器。如果您想坚持windows安装中提供的功能,请尝试写字板

  4. # 5 楼答案

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

    response.setCharacterEncoding("UTF-8")

    应该解决你的目的

  5. # 6 楼答案

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