我的程序使用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 ++,一切都很好。 :)
答案 0 :(得分:0)
equals
将无效 - 就内部string
表示而言 - 它们是绝对不同的数据
在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。