32

我保存了我的 Java 源文件,指定它的编码类型为 UTF-8(使用记事本,默认情况下记事本的编码类型是 ANSI),然后我尝试使用以下方法编译它:

javac -encoding "UTF-8" One.java

但它给出了一条错误消息“

One.java:1: illegal character: \65279

?public class One {

^
1 error

有没有其他方法,我可以编译这个?

这是来源:

public class One {
    public static void main( String[] args ){
        System.out.println("HI");
    }
} 
4

11 回答 11

47

您的文件读取为 UTF-8,否则永远不会出现值为“65279”的字符。javac根据文档javac希望您的源代码采用平台默认编码:

如果未指定-encoding,则使用平台默认转换器。

十进制 65279 是十六进制 FEFF,即Unicode 字节顺序标记 (BOM)。这在 UTF-8 中是不必要的,因为 UTF-8 总是被编码为八位字节流并且没有字节序问题。

即使不需要,记事本也喜欢粘贴 BOM,但有些程序不喜欢找到它们。正如其他人所指出的,记事本不是一个很好的文本编辑器。切换到不同的文本编辑器几乎肯定会解决您的问题。

于 2009-11-12T23:47:48.397 回答
20

在 Notepad++ 中打开文件并选择编码 -> 转换为 UTF-8 而不使用 BOM。

于 2012-06-10T12:18:11.893 回答
14

这不是您的文本编辑器的问题,而是 javac 的问题!Unicode 规范说 BOM 在 UTF-8 中是可选的,它并没有说它是禁止的!如果 BOM 可以在那里,那么 javac 必须处理它,但它没有。实际上,在 UTF-8 文件中使用 BOM 有助于区分 ANSI 编码文件和 Unicode 编码文件。

删除 BOM 的建议解决方案只是一种解决方法,而不是正确的解决方案。

这个错误报告表明这个“问题”永远不会被修复:https ://web.archive.org/web/20160506002035/http://bugs.java.com/view_bug.do?bug_id=4508058

由于该线程在“javac BOM”搜索的前 2 个 google 结果中,因此我将其留给未来的读者。

于 2015-01-20T10:50:00.190 回答
9

尝试javac -encoding UTF8 One.java

没有引号,它是 UTF8,没有破折号。

有关更多链接,请参阅此论坛主题

于 2009-11-12T23:44:52.710 回答
6

见下文例如我们可以用程序讨论(泰卢固语单词)

程序 (UnicodeEx.java)

class UnicodeEx {  
    public static void main(String[] args) {   
        double ఎత్తు = 10;  
        double వెడల్పు = 25;   
        double దీర్ఘ_చతురస్ర_వైశాల్యం;  
        System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n");  
        దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు;  
        System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం);  
    }  
}

这是保存为“UnicodeEx.java”并将编码更改为“unicode”的程序

**如何编译**

javac -encoding "unicode" UnicodeEx.java

如何执行

java UnicodeEx

高度的值 = 10.0 和宽度 = 25.0

矩形面积 = 250.0

于 2014-08-28T05:59:11.097 回答
4

我知道这是一个非常古老的线程,但是我在 PHP 而不是 Java 上遇到了类似的问题,Google 把我带到了这里。我在 Notepad++(不是普通的记事本)上编写 PHP,并注意到每次调用包含文件时都会出现一条额外的白线。Firebug 显示这些额外的行中有一个 65279 字符。

实际上,主要的 PHP 文件和包含的文件都是用 UTF-8 编码的。但是,Notepad++ 也可以选择编码为“UTF-8 without BOM”。这解决了我的问题。

底线:UTF-8 编码会在这里和那里插入这个额外的 BOM 字符,除非您指示编辑器在没有 BOM 的情况下使用 UTF8。

于 2012-02-03T20:21:57.207 回答
0

在这里工作正常,甚至在记事本中编辑。故事的寓意是,不要使用记事本。那里可能有一个不可打印的字符,记事本要么正在插入,要么很高兴地向你隐藏。

于 2009-11-12T23:45:04.847 回答
0

我有同样的问题。为了解决这个问题,在十六进制编辑器中打开了文件,并在文件的开头发现了三个“不可见”字节。我删除了它们,编译工作。

于 2014-09-21T11:48:26.413 回答
0
  • 使用写字板或除记事本以外的任何其他编辑器打开文件。

  • 选择另存为类型为文本文档 - MS-DOS 格式

  • 重新打开项目

于 2016-05-10T16:13:55.170 回答
0

使用适用于 Linux 用户的解决方案扩展现有答案

要一次删除所有文件的 BOM .java,请转到源目录并执行

find -iregex '.*\.java' -type f -print0 | xargs -0 dos2unix

需要find和被安装xargsdos2unix它应该包含在大多数发行版中。第一条语句.java递归查找当前目录中的所有文件,第二条语句使用该dos2unix工具转换每个文件,该工具旨在转换行尾但也删除 BOM。

如果您正确配置版本控制,则行尾转换应该没有任何影响,因为它应该已经是 Linux\n上的 Linux 格式,但请注意,如果您遇到不希望这样做的罕见情况之一,它也会这样做。

于 2017-04-26T14:31:09.830 回答
0

在 Intellij Idea(Settings>Editor>File Encodings) 中,项目编码为“windows-1256”。所以我使用以下代码将静态字符串转换为utf8

protected String persianString(String persianStirng) throws UnsupportedEncodingException {
    return new String(persianStirng.getBytes("windows-1256"), "UTF-8");
}

现在好了!根据文件编码,您应该将“windows-1256”更改为正确的

于 2019-06-10T12:43:32.227 回答