用斯堪的纳维亚字符比较单词

时间:2014-08-26 07:53:37

标签: java netbeans special-characters equals

我的程序使用Scanner类从文件中读取几个单词并将它们与用户输出进行比较。我的编辑器是NetBeans和OS Windows 7.我首先在NetBeans中运行该程序并且没有任何问题。当我在命令提示符下运行它时,斯堪的纳维亚字符(ä,ö,å,Ä,Ö,Å)无法正确显示。好吧,我测试并为扫描仪提供了不同的参数,如ISO-8859-1,但它没有帮助。最后,我为它提供了UTF-8,角色也很好。但是我遇到了一个新问题。我使用equals方法来比较两个单词。但现在它并没有“起作用”。虽然单词应该是equals方法返回false。如果我没有为Scanner设置任何字符集,则该程序在NetBeans中运行良好,但在命令提示符下则不行。那么我能做什么以及为什么不等于方法工作呢?我应该创建自己的比较方法吗?

public void readingWordsFromFile(String textfile){

try{
    File f = new File("WordLists\\" + textfile + ".txt" );
    Scanner l = new Scanner(f, "UTF-8");

    try{

    int i = 1;
    while( l.hasNext() ){

        String temp = l.nextLine();

        words.put(i, temp);

        i++;
    }
    }
    catch (Exception e){
    }
    finally{
    l.close();
    }
}
catch (Exception e){
}
}

编辑:“已解决”。答案与字符集无关。文件包含BOM,因为我不小心用记事本保存了它们。所以现在我再次使用Notepad ++,一切都很好。 :)

3 个答案:

答案 0 :(得分:0)

    比较不同encondings中的两个字符串时,
  1. equals将无效 - 就内部string表示而言 - 它们是绝对不同的数据

  2. 在Windows cmd中使用时,您应该尝试为扫描程序设置正确的编码。尝试使用chcp中的命令cmd查看其中使用的代码页。

答案 1 :(得分:0)

Windows cmd is not UTF8 by default。 netbeans控制台是UTF8,因此它可以正常工作。

实际上,如果您在控制台中键入chcp并按Enter键,则应该看到

Current active code table is: 850

这是ASCII Latin 1 charset。

答案 2 :(得分:0)

尽可能使用UTF-8,通常可以通过StandardCharsets.UTF_8。瑞典ISO-8859-4比上述ISO-8859-1更合适。

然而,Unicode的一个问题是重音字母作为一个Unicode代码点(包含重音的字母)出现,并且作为单独的Unicode代码点:ASCII字母和"组合变音符号" (重音)。对于文本规范化,可以使用java.text.Normalizer

java中编码的使用受到许多方法和构造函数签名的影响,这些签名具有重载版本,没有编码默认为操作系统(或集合)编码。

在你的情况下,它看起来像后者。没有指定编码的扫描程序,FileReader / FileWriter,InputStreamReader,new String。