【问题标题】:jar java program encodedjar java程序编码
【发布时间】:2014-02-27 10:01:24
【问题描述】:

我在 netbeans 中制作了一个读取文本文件的小型 Java 程序。当我在我的 netbeans 中运行该程序时,一切正常。所以我为我的程序制作了一个可执行的 jar,但是当我运行那个 jar 时,当程序读取文本文件时,我得到了连线字符。

例如: 我得到“Céleste”,但它必须是 Céleste。

这是我读取文件的代码:

private void readFWFile(File file){
    try {
        FileReader fr = new FileReader(file); 
        BufferedReader br = new BufferedReader(fr); 
        String ligne; 
        while((ligne = br.readLine()) != null) { 
            System.out.println(ligne);
        } 

        fr.close();
    } catch (IOException ex) {
        Logger.getLogger(FWFileReader.class.getName()).log(Level.SEVERE, null, ex);
    }
}

【问题讨论】:

  • 你能在我得到“Céleste”,但它必须是 Céleste 的意思吗?
  • 听起来 NetBeans 支持 Unicode,但您的命令行环境不支持。检查您的操作系统是否可以切换到 Unicode 友好(或至少 Unicode 容忍)模式。

标签: java netbeans executable-jar


【解决方案1】:

这种输出是由某处不匹配引起的 - 您的文件以 UTF-8 编码,但打印数据的控制台需要单字节编码,例如 Windows-1252。

您需要 (a) 确保您以 UTF-8 格式读取文件,并且 (b) 确保您使用预期的编码写入控制台。

FileReader 在读取文件时始终使用平台默认编码。如果这是 UTF-8,那么

  • 您的 Java 代码以 UTF-8 格式读取文件并看到 Céleste
  • 然后您将该数据打印为 UTF-8
    • 在 NetBeans 中,控制台显然需要 UTF-8 并正确显示数据
    • 在 NetBeans 之外,控制台需要单字节编码并显示不正确的呈现。

或者,如果您的默认编码是单字节,那么

  • 您的 Java 代码将文件作为单字节编码读取并看到 Céleste
  • 然后您将该数据打印为相同的编码
    • NetBeans 将您写入的字节视为 UTF-8 并显示 Céleste
    • 在 NetBeans 之外,您会看到最初读取的错误数据。

使用InputStreamReaderFileInputStream 以确保您以正确的编码读取数据,并确保在将数据打印到控制台时使用控制台期望的编码。

【讨论】:

  • 强烈怀疑并不能成为答案。
  • @John 是的,我已经改写了一些内容。
  • 这个答案确实提供了最好的解释(后期编辑)。如果您只想为您编写代码,您可以随时参考 Joni 的答案。
【解决方案2】:

FileReader 类使用“平台默认字符编码”将文件中的字节解码为字符。您的文件似乎是用 UTF-8 编码的,而默认编码是您系统上的其他编码。

您可以使用InputStreamReader 以特定编码读取文件:

    Reader fr = new InputStreamReader(new FileInputStream(file), "UTF-8"); 

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多