32

我有一个程序,允许用户在富文本框中键入 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
4

10 回答 10

22

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

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

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

于 2010-01-02T22:11:22.597 回答
19

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

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

javac -encoding UTF8 Test.java

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

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

于 2010-01-02T22:30:52.423 回答
6
  1. 如果使用 IDE,请指定 java 文件编码(通过属性面板)
  2. 如果不使用 IDE,请使用高级文本编辑器(我可以推荐Notepad++)并将编码设置为“UTF without BOM”或“ANSI”,如果适合您的话。
于 2010-01-02T21:43:30.543 回答
4

在这种情况下,请执行以下步骤 1-7

在 Android Studio 中

1. Menu -> Edit -> Select All
2. Menu -> Edit -> Cut
  1. 打开新的记事本.exe

在记事本中

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

回到 Android Studio

7. Menu -> Edit -> Paste
于 2018-01-21T17:16:55.847 回答
3

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

字节顺序标记 (BOM) 是一个 Unicode 字符,用于表示文本文件或流的字节顺序(字节顺序)。它的代码点是 U+FEFF。BOM 的使用是可选的,如果使用,应该出现在文本流的开头。除了作为字节顺序指示符的特定用途之外,BOM 字符还可以指示文本编码的几种 Unicode 表示形式中的哪一种。

BOM 是一个看起来很时髦的字符,您有时会在 unicode 流的开头找到它,它提供了编码是什么的线索。它通常由 Java 中的字符串处理的东西无形地处理,所以你一定以某种方式混淆了它,但是如果没有看到你的代码,很难看出在哪里。

您可以通过在将 BOM 馈送到javac. 它可能符合空格,因此请尝试调用trim()输入字符串,并将其输出提供给javac.

于 2010-01-02T21:42:02.460 回答
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.
于 2016-03-15T14:10:44.863 回答
2

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

于 2016-11-11T18:53:00.887 回答
1

而不是得到记事本++,您可以简单地使用写字板打开文件,然后另存为 - 纯文本文档

于 2016-09-06T15:29:26.737 回答
0

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

于 2016-07-03T05:15:18.440 回答
0

我在使用echo echo "" > Main.javaWindows Powershell 中的命令生成的文件时遇到了同样的问题。我搜索了这个问题,它似乎与编码有关。我检查了文件的编码使用file -i Main.java,结果是文本/纯文本;字符集=utf-16le

后来我删除了该文件并使用 git bash 重新创建了它,touch Main.java并使用此文件成功编译。我使用 file -i 命令检查了文件编码,这次结果是Main.java: text/xc; 字符集=us-ascii

接下来我搜索了互联网,发现要使用 Powershell 创建一个空文件,我们可以使用 Cmdlet New-Item。我使用创建文件New-Item Main.java并检查了它的编码,这次结果是Main.java: text/xc; charset=us-ascii,这次编译成功。

于 2021-04-10T06:01:34.723 回答