当前位置: 首页 > 面试题库 >

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

庄智
2023-03-14
问题内容

我打开 记事本 (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();

吐司
输出(用于那些谁不熟悉与Android,吐司只是一个显示弹出式屏幕,在它特定的文本法)的罚款。控制台显示“奇怪的字符”(可能是由于控制台窗口中的编码)。但是它无法解析整数,因为控制台显示this(warning: toast output is just fine)-
问题?

看来String包含一些Toast无法显示/呈现的“怪异”字符,但是当我尝试解析它时,它崩溃了。有什么建议吗?

如果我将ANSI放在NotePad中,则可以正常工作(整数解析),并且没有上图所示的奇怪字符,但是我的特殊字符当然不起作用。


问题答案:

它是不支持这些字符的输出控制台。由于使用的是Eclipse,因此需要确保将其配置为使用UTF-8。您可以通过 _窗口

首选项>常规>工作区>文本文件编码>设置为UTF-8来执行此操作_。

也可以看看:

  • Unicode-如何正确获取字符?

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

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) {}
}

同样不相关的是,我建议将其放在Patternp=Pattern.compile(",");循环之外,甚至将其设置为静态常量,因为编译起来相对昂贵,并且不必每次都在循环内执行此操作。



 类似资料:
  • 我目前正在开发一个解析器。我走在一棵树上,大部分是决定论的(我能找到的数值有限)。 通常在这些情况下,我会创建一个枚举,其中包含我希望找到的值的名称,如下所示: 在这种情况下,我可以通过以下方式检查字符串是否属于枚举: 问题是目前我和特殊角色一起工作({" 我想要的是将枚举与那些特殊的字符元素相关联,例如 并继续使用以下简单明了的方法: 目前,我在任何地方都使用枚举,但对于这些元素,我使用表。我想

  • 我必须使用SSIS从数据库导出CSV文件 这很容易做到,但当我必须将同一个CSV文件导入另一个数据库(从另一台服务器)时,问题就来了,因为我有两列,其中包含以下字符:逗号(,)、撇号(')、分号(;),冒号(:),竖线(|)。我不知道哪个应该是平面文件连接的设置,哪个应该是标题行分隔符、行分隔符、列分隔符。。。以便执行这两个操作(导出,然后导入)。 我尝试了许多组合,但我仍然得到错误,如: [平面

  • 这就是我获取XML响应的方式: 希望有人能帮我。我认为URLConnection或其中一个流需要设置为UTF-8,考虑到谷歌的响应也是用UTF-8编码的?!

  • 问题内容: 我遇到了一个大问题,即通过jQuery Ajax将数据作为JSON发布到我的服务器。JSLint表示数据正常,并且请求的Content- Type设置为。服务器在PHP 5.2.11上运行,所以我不能使用。 我尝试了url_decode,utf8_decode和html_entities_decode,但似乎没有任何效果。 返回null,但如果执行此操作,一切正常。是发布数据:。 这是

  • 我有一个HashMap,里面有键和值。我想用字符串中映射的值替换键。 在字符串中,键被写成@keyname或@“keyname”,这些应替换为map.get(“keyname”) 假设我们的地图是这个 所以如果我们处理字符串“Hello world,Iam@key1 years old.”,它将变成“Hello world,Iam 2 years old.”。 我们可以用@“key1”代替@key