编译使用 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 这次编译成功了
我一直在使用 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 这次编译成功了