如何编译一个编码为“UTF-8”的java源文件?

我保存了我的Java源文件,指定它的编码types为UTF-8(使用记事本,默认情况下记事本的编码types是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"); } } 

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

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

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

记事本即使在没有必要的时候也喜欢粘贴在物料清单中,但有些程序不喜欢find它们。 正如其他人指出的,记事本不是一个很好的文本编辑器。 切换到不同的文本编辑器几乎肯定会解决您的问题。

在Notepad ++中打开文件并select编码 – >转换为没有BOM的UTF-8。

试试javac -encoding UTF8 One.java

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

看到这个论坛主题更多的链接

这不是你的文本编辑器的问题,这是一个javac的问题! Unicode规范说,BOM是UTF-8的唯一选项,但并不禁止! 如果物料清单可以在那里,那么javac必须处理它,但它不。 实际上,在UTF-8文件中使用BOM对于区分ANSI编码文件和Unicode编码文件非常有用。

build议的删除BOM解决scheme只是一个解决方法,而不是适当的解决scheme。

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

由于这个线程在“javac BOM”search的前2个谷歌search结果中,我将在这里留给未来的读者。

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

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

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

看下面例如我们可以用一个程序来讨论(泰卢固语)

程序(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

在这里工作正常,甚至在记事本中编辑。 道德的故事是,不要使用记事本。 有可能是一个不可打印的字符,记事本是插入或幸福地躲在你身边。

我有同样的问题。 为了解决这个问题,用hex编辑器打开文件,在文件的开头find三个“不可见”的字节。 我删除了他们,编译工作。

  • 用写字板或除记事本以外的其他编辑器打开您的文件。

  • select另存为types作为文本文档 – MS-DOS格式

  • 重新打开该项目

使用针对Linux用户的解决scheme扩展现有答案

要一次删除所有.java文件的BOM,请进入您的源代码目录并执行

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

需要安装xargsdos2unix ,这些应该包含在大多数发行版中。 第一个语句以recursion方式查找当前目录中的所有.java文件,第二个语句使用dos2unix工具转换其中的每一个文件,该工具用于转换行尾,但也删除BOM。

如果您正确地configuration您的版本控制,但是在Linux中,应该已经在Linux \n格式中应该已经没有任何效果了,但是要注意,如果您有其中一个罕见情况。