无法从java中的UTF-8 txt文件中读取特殊字母

无法从java中的UTF-8 txt文件中读取特殊字母,java,encoding,utf-8,Java,Encoding,Utf 8,我对java中的UTF-8编码有问题。 我有一个UTF-8编码的.txt文件。我已经在notepad++中检查过该文件实际上是UTF-8编码的。 我试着读文件,但特殊字母显示不正确 我使用以下代码: try { Scanner sc = new Scanner(new FileInputStream("file.txt"), "UTF-8"); String str; while(sc.hasNextLine()) {

我对java中的UTF-8编码有问题。 我有一个UTF-8编码的.txt文件。我已经在notepad++中检查过该文件实际上是UTF-8编码的。 我试着读文件,但特殊字母显示不正确

我使用以下代码:

        try {

        Scanner sc = new Scanner(new FileInputStream("file.txt"), "UTF-8");

        String str;

        while(sc.hasNextLine()) {
            str = sc.nextLine();
            roadNames.add(str);
            System.out.println(str);
        }

        sc.close();

    } catch(IOException e1) {
        System.out.println("The file was not found....");
    }
它在eclipse中正确地显示了特殊字母,在eclipse中,我将默认编码定义为UTF-8,但在生成的jar文件中没有

对我来说,唯一有效的方法是使用以下参数创建一个.bat文件“java-Dfile.encoding=utf-8-jar executable.jar”,但我认为这不是一个好的解决方案

此外,这也适用于:

PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
out.println(str);
更新

当我说

特殊字母显示不正确

我的意思是System.out.println打印一个字符串,其中特殊字母替换为├例如,用a代替å

结果是

PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
out.println(str);
毕竟不行-很抱歉


真正的问题不是我希望控制台打印出文本文档中的内容,而是文本文档中的每一行都包含一个名称,并且该名称被添加到ArrayList中。然后我有一个JTextField,当我开始在它里面输入时,它试图通过在ArrayList中搜索最匹配的名称来自动完成我输入的内容。如果不是因为编码问题,因为JTextField中的特殊字母没有正确显示,那么这种方法非常有效。只有在使用Dfile.encoding=utf-8参数时才会正确显示,除非您指定其他内容,否则Java将使用平台默认编码

听起来您的平台默认设置(Windows设置)不是UTF-8,因此在未指定
file.encoding
属性或未向
PrintStream
构造函数提供编码的情况下,将使用默认编码。在这种情况下,当发现无法编码的字符时,将使用该编码器的替换字符。这通常是�' 或者“?”

操作系统指示它可能无法显示您希望打印的某些字符。您可以忽略该提示,并希望得到最好的结果,或者您可以用保证显示的内容替换麻烦的字符。默认为替换;如果你想使用风险更大的方法,你必须明确


更新:根据原始问题更新中提供的信息,问题似乎在于读取文件,而不是其输出

使用平台默认编码是一种例外情况。您应该遵循的一般模式是每次将字节序列解码为字符串时显式指定编码。编码是您正在读取的流所固有的,并且通常独立于您的代码所运行的系统。例外情况是当您从控制台或类似设备读取时。否则,应该有一些元数据或约定来指定编码,比如HTTP头、文件中嵌入的属性或需要特定编码的标准

以下是如何从UTF-8编码文件中读取道路名称:

Set<String> roadNames = new TreeSet<>();
try (InputStream bytes = new FileInputStream("file.txt")) {
  /* See how I'm specifying the UTF-8 encoding explicitly? */
  Reader chars = new InputStreamReader(bytes, StandardCharsets.UTF_8);
  BufferedReader lines = new BufferedReader(chars);
  while (true) {
    String line = lines.readLine();
    if (line == null)
      break;
    roadNames.add(line);
  }
}
Set roadNames=new TreeSet();
try(InputStream字节=新文件InputStream(“file.txt”)){
/*看看我是如何明确指定UTF-8编码的*/
Reader chars=新的InputStreamReader(字节,StandardCharsets.UTF_8);
BufferedReader行=新的BufferedReader(字符);
while(true){
String line=lines.readLine();
如果(行==null)
打破
道路名称。添加(行);
}
}

我也有同样的问题。使用Charset.forName(“cp866”)应该会有所帮助

BufferedReader brI = new BufferedReader(new InputStreamReader(cmd.getInputStream(), Charset.forName("cp866")));
        String result;
        while ((result = brI.readLine()) != null){
            System.out.println(result);
        }

“正确显示特殊字母”是什么意思?在eclipe中可以看到非拉丁符号,但在windows中打开.bat文件时,会看到一个?如果您没有看到正确的字符,可能是因为您没有在windows上安装正确的语言包。这不是一个Java问题。如果文件中的字节是正确的,那么它与JavaWhere无关,您在哪里尝试显示它们?>但是特殊的字母显示不正确。如果你说的是这一行:
System.out.println(str)那么问题是,您的控制台无法显示这些字符。除此之外,你做的一切都是对的。突击队提示没有正确显示像æ,ø,å这样的字符,但是有一些奇怪的符号,字符,é也没有正确显示,但也有一些奇怪的符号。这只适用于eclipse,甚至在我使用Dfile.encoding=utf-8参数运行jar文件时也不起作用。我有一个JTextfield,其中包含roadNames ArrayList中插入的一个字符串中的一个字符串。当我使用Dfile.encoding=utf-8参数时,JTextField正确显示æ、ø、å,但不正确。您是否正在从文件中读取
roadNames
列表?如果是这样,在
cmd.exe
控制台中运行命令
type file.txt
时,您会看到什么?听起来你的Windows设置是罪魁祸首;你可以得到更多的背景资料