【问题标题】:Cannot compile Java file with non-ASCII character无法编译具有非 ASCII 字符的 Java 文件
【发布时间】:2019-07-29 16:40:08
【问题描述】:

重要:

我只能使用纯 Windows 记事本(IDE、Notepad++ 或任何其他文本编辑器都不允许)。

所以我有一个简单的类:

class Test{
    public static void main(String[] args){
       char c = 'қ';
       System.out.println(c);
    }
 }

默认情况下,记事本使用 ANSII 编码保存文本文件,但如您所见,我的代码中有一个非 ANSII 字符。我可以通过命令提示符编译和运行这段代码,但输出是? 而不是қ,这似乎很明显。当我将文件的编码更改为 UTF-8 时,编译器会引发错误。我已经阅读了这篇文章Illegal Character when trying to compile java code,但是对于我的特定问题没有解决方案,因为正如我上面所写的,我不能使用任何文本编辑器,只能使用 Windows 记事本。

谢谢!

【问题讨论】:

  • 我复制了相同的代码。当我运行 Visual Studio 代码时,与提到的相同的 o/p。但是无法通过cmd编译得到以下错误:a.java:1:错误:非法字符:'\u00bb'∩╗┐class Test{^ a.java:1:错误:非法字符:'\u00bf'∩╗┐ class Test{ ^ a.java:3: error: unclosed character literal char c = '╥¢'; ^ a.java:3: 错误: 非法字符: '\u203a' char c = '╥¢'; ^ a.java:3: 错误:未闭合字符文字 char c = '╥¢'; ^ 5 个错误
  • 你不能用 Windows 记事本来做。
  • @SumanDey 据我了解,原因是 Windows 在文件开头附加了一个名为 BOM 的字符,以表明该文件使用的是非 ASCII 编码。但是如何解决这个问题?
  • 你如何告诉 javac 你的源文件使用哪种字符编码?
  • @TomBlodget 我没有告诉 javac 任何事情。如果您的意思是是否正在编写“javac -encoding UTF8 Test.java”,是的,我尝试过,但没有成功。

标签: java encoding compiler-errors notepad byte-order-mark


【解决方案1】:

可能你需要这样:

char c = '\u039A'; 

我不知道你的“k”的代码,但你可以在https://www.ssec.wisc.edu/~tomw/java/unicode.html找到它

也希望Windows有这个字符在控制台输出

附言windows的控制台有一定的代码页。尝试在控制台中更改它,例如:

REM change CHCP to UTF-8
CHCP 65001
CLS

记住windows控制台中不同的字体,其中一些不能绘制特定的符号。

【讨论】:

  • 似乎 Windows 在其“可用字符池”或其他任何内容中都没有这个字符,因为我什至无法手动输入它。真的很奇怪……
  • 好的,你可以使用'@ECHO OFF REM 将 CHCP 更改为 UTF-8 CHCP 65001 CLS'
【解决方案2】:

是的,问题是 javac 在不接受 UFT-8 的 BOM 方面是不合规的。

使用记事本保存为 Unicode(实际上是 UTF-16LE)。

编译

javac -encoding UTF-16 Test.java

【讨论】:

  • 不符合什么? Unicode 规范是否要求文本处理器从初始 BOM 中直观编码?
  • 不,它要求他们接受 BOM,除非明确给出具有字节顺序的编码并且也给出。 (如果他们在编码没有字节顺序时禁止它,会简单得多。)
  • 看来,当给定具有字节顺序的编码(UTF-8 除外)时,BOM 是被禁止的。来自unicode.org/faq/utf_bom.html#bom9:“……如果文本数据流被标记为 UTF-16BE、UTF-16LE、UTF-32BE 或 UTF-32LE,则 BOM 既不是必需的,也不是允许的。”(强调他们的) ) 不过,我同意你的命令行解决方案。
  • 已编译,但输出仍然是? 而不是қ
  • @MukhamedaliZhadigerov 你确定қ 字符可以显示在命令窗口中吗?
猜你喜欢
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
相关资源
最近更新 更多