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

时间:2009-11-12 23:37:17

标签: java unicode compiler-errors javac

我保存了我的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");
    }
} 

11 个答案:

答案 0 :(得分:45)

您的文件 被读取为UTF-8,否则将永远不会出现值为“65279”的字符。根据{{​​3}}:

javac希望您的源代码采用平台默认编码
  

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

十进制65279是十六进制FEFF,即the javac documentation。在UTF-8中没有必要,因为UTF-8总是被编码为八位字节流,并且没有字节序问题。

记事本喜欢坚持使用物料清单,即使它们不是必需的,但有些程序不喜欢找到它们。正如其他人所指出的那样,Notepad不是一个非常好的文本编辑器。切换到不同的文本编辑器几乎肯定会解决您的问题。

答案 1 :(得分:20)

在Notepad ++中打开文件,然后选择编码 - >转换为没有BOM的UTF-8。

答案 2 :(得分:10)

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

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

此错误报告表明此问题"永远不会修复:http://bugs.java.com/view_bug.do?bug_id=4508058

由于此主题位于" javac BOM"的前2位Google搜索结果中搜索,我将此留给未来的读者。

答案 3 :(得分:9)

尝试javac -encoding UTF8 One.java

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

See this forum thread for more links

答案 4 :(得分:4)

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

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

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

答案 5 :(得分:4)

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

计划(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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我遇到了同样的问题。要解决它,请在十六进制编辑器中打开文件,找到三个"隐形"文件开头的字节数。我删除了它们,编译工作。

答案 8 :(得分:0)

  • 使用写字板或除记事本之外的任何其他编辑器打开文件。

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

  • 重新开启项目

答案 9 :(得分:0)

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

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

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

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

行结尾转换应该没有效果,因为它应该已经在Linux上以Linux \n格式存在,如果你正确配置你的版本控制但是要警告它也会这样做,以防你有一个罕见的无意的情况。

答案 10 :(得分:0)

在Intellij Idea(设置>编辑器>文件编码)中,项目编码为“ windows-1256”。所以我用下面的代码将静态字符串转换为utf8

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

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