编译使用 geany \u0000 制作的程序时出现非法字符错误

Illegal character error when compiling a program made using geany \u0000

我一直在使用 Geany 创建 Java 程序,直到现在我都能够成功编译它们。下面在Java中创建的简单程序是使用Geany制作的,但是出现了非法字符错误(\u0000)。

public class SumOfCubedDigits
{
    public static void main(String[] args)
    {
        for (int i=1; i<=9; i++)
        {
            for (int j=0; j<=9; j++)
            {
                for (int k=0; k<=9; k++)
                {
                    double iCubed=Math.pow(i,3);
                    double jCubed=Math.pow(j,3);
                    double kCubed=Math.pow(k,3);
                    double cubedDigits = iCubed + jCubed + kCubed;
                    int concatenatedDigits = (i*100 + j*10 + k);
                    if (cubedDigits==concatenatedDigits)
                    {
                        System.out.println(concatenatedDigits);
                    }
                }
            }
        }
    }
}

我在 nano 中重新创建了程序,它能够成功编译。然后我以不同的名称 SumTest.java 将它复制到 Geany,编译它并得到相同的非法字符错误。显然,错误出在 Raspberry Pi 的 Geany IDE 上。我想知道如何修复编辑器以成功创建和编译程序,因为它不仅仅是这个程序,它是在 Java 中使用 Geany 创建的任何程序。

这可能是 Geany 在保存源文件时使用的编码问题。

如果您使用 javac 编译文件而未指定 -encoding 参数,则使用平台的默认编码。在现代 Linux 上,这很可能是 UTF-8; Windows 我认为它是 ANSI 字符集或 UTF-16 之一。

要找出默认编码是什么,您可以编译 运行 一个小 java 程序:

public class DefaultCharsetPrinter {
    public static void main(String[] argv) {
        System.out.println(Charset.defaultCharset());
    }
}

这应该打印 java 程序使用的默认编码的名称。

在 Geany 中,您可以在菜单 文档 > 设置编码 中设置文件编码。您需要将其设置为 javac 使用的相同值。 Geany 手册描述了 additional options for setting the encoding

正如您看到很多关于空字符的错误,Geany 很可能将文件存储在每个字符有多个字节的编码中(例如 UTF-16),而 javac 使用编码每个字符一个字节。如果我将您的源文件保存为 UTF-16,然后尝试使用 UTF-8 编码以 javac 编译它,我会收到与您看到的相同的错误消息。在 Geany 中将文件保存为 UTF-8 后,文件编译没有问题。

我在 Windows Powershell 中使用命令 echo echo "" > Main.java 生成的文件遇到了同样的问题。 查了一下问题,好像和编码有关。我使用 file -i Main.java 检查了文件的编码,结果是 text/plain; charset=utf-16le.

后来我删除了文件并使用 git bash 和 touch Main.java 重新创建了它,并且文件编译成功。我使用 file -i 命令检查了文件编码,这次结果是 Main.java: text/x-c; charset=us-ascii.

接下来我搜索了互联网,发现要使用 Powershell 创建一个空文件,我们可以使用 Cmdlet New-Item。我使用 New-Item Main.java 创建文件并检查了它的编码,这次结果是 Main.java: text/x-c; charset=us-ascii 这次编译成功了