我有一个程序,允许用户在富文本框中键入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
答案 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)
答案 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
在记事本中
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 这次编译成功了。