尝试编译java代码时非法字符

时间:2010-01-02 21:33:53

标签: java javac

我有一个程序,允许用户在富文本框中键入java代码,然后使用java编译器编译它。每当我尝试编译我编写的代码时,我都会收到一条错误消息,指出我的代码开头有一个非法字符。这是编译器给我的错误:

C:\Users\Travis Michael>"\Program Files\Java\jdk1.6.0_17\bin\javac" Test.java
Test.java:1: illegal character: \187
public class Test
 ^
Test.java:1: illegal character: \191
public class Test
  ^
2 errors

10 个答案:

答案 0 :(得分:17)

当您未指定编码时,BOM由File.WriteAllText()或StreamWriter生成。默认设置是使用UTF8编码并生成BOM。您可以使用-encoding命令行选项告诉java编译器。

阻力最小的路径是避免生成BOM。通过指定System.Text.Encoding.Default来执行此操作,该文件将使用操作系统的默认代码页中的字符编写文件,并且不会编写BOM。使用File.WriteAllText(String,String,Encoding)重载或StreamWriter(String,Boolean,Encoding)构造函数。

只需确保您创建的文件不会被世界另一个角落的计算机编译。它将产生mojibake

答案 1 :(得分:13)

这是一个字节顺序标记,正如大家所说。

javac不了解BOM,即使您尝试类似

的内容也是如此
javac -encoding UTF8 Test.java

您需要剥离BOM或将源文件转换为其他编码。 Notepad ++可以转换单个文件编码,我不知道Windows平台上的批处理实用程序。

java编译器将假定该文件采用您的平台默认编码,因此如果您使用此编码,则不必指定编码。

答案 2 :(得分:4)

  1. 如果使用IDE,请指定java文件编码(通过属性面板)
  2. 如果不使用IDE,请使用高级文本编辑器(我可以推荐Notepad++)并将编码设置为“UTF without BOM”或“ANSI”(如果适合您)。

答案 3 :(得分:3)

http://en.wikipedia.org/wiki/Byte_order_mark

  

字节顺序标记(BOM)是Unicode   用于表示信号的字符   文本文件的字节顺序(字节顺序)   或流。它的代码点是U + FEFF。   BOM使用是可选的,如果使用,   应该出现在文本的开头   流。超出其特定用途   字节顺序指示符,BOM   字符也可能表示哪个   几个Unicode表示   文本编码为。

BOM是一个看起来很时髦的角色,你有时会在unicode流的开头找到它,给出了编码的线索。它通常由Java中的字符串处理函数无形地处理,所以你必须以某种方式混淆它,但是如果没有看到你的代码,就很难看到它在哪里。

您可以通过从字符串中手动剥离BOM,然后再将其提供给javac来轻松修复它。它可能有资格作为空格,因此请尝试在输入字符串上调用trim(),并将其输出提供给javac

答案 4 :(得分:2)

这是与BOM(字节顺序标记)字符相关的问题。字节顺序标记BOM是用于定义文本文件字节顺序的Unicode字符,位于文件的开头。 Eclipse在文件的开头不允许使用此字符,因此您必须将其删除。为此,使用像Notepad ++这样的富文本编辑器,并使用编码“UTF-8 without BOM”保存文件。这应该可以消除这个问题。

I have copy pasted the some content from a website to a Notepad++ editor,
it shows the "LS" with black background. Have deleted the "LS" content and 
have copy the same content from notepad++ to java file, it works fine.

答案 5 :(得分:2)

我通过右键单击我的textEdit程序文件并选择[替换]并取消选中智能引号来解决这个问题。

答案 6 :(得分:2)

在Android Studio中

1. Menu -> Edit -> Select All
2. Menu -> Edit -> Copy
  1. 打开新的Notepad.exe
  2. 在记事本中

    4. Menu -> Edit -> Paste
    5. Menu -> Edit -> Select All
    6. Menu -> Edit -> Copy 
    

    返回Android Studio

    7. Menu -> Edit -> Paste
    

答案 7 :(得分:1)

而不是获得Notepad ++, 你可以简单 使用Wordpad打开文件 然后 另存为 - 纯文本文档

答案 8 :(得分:0)

即使我正面临这个问题,因为我正在使用notepad ++进行编码。在notepad ++中输入代码非常方便。但是在编译之后我得到一个错误“错误:非法字符:'\ u00bb'”。 方案: 开始在旧版本的记事本中编写代码(默认情况下将在您的PC中)并保存。稍后可以使用记事本++完成修改。 它有效!!!

答案 9 :(得分:0)

我在 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 这次编译成功了。