如何编译一个编码为“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
需要安装xargs
和dos2unix
,这些应该包含在大多数发行版中。 第一个语句以recursion方式查找当前目录中的所有.java
文件,第二个语句使用dos2unix
工具转换其中的每一个文件,该工具用于转换行尾,但也删除BOM。
如果您正确地configuration您的版本控制,但是在Linux中,应该已经在Linux \n
格式中应该已经没有任何效果了,但是要注意,如果您有其中一个罕见情况。