当我尝试包含Urdu字符串时,为什么会出现编译错误?

时间:2012-10-11 04:14:43

标签: java unicode utf-8 illegal-characters

我正在尝试添加urdu字符串غزل,如下所示:

class UnicodeCheck {
  public static void main(String args[]) {
   try {
    File f = new File("C:/Users/user/Desktop/unicodecheck.txt");
    FileWriter writer = new FileWriter(f);
    writer.write("غزل");
    writer.close();
   } catch(Exception exc) {
       exc.printStackTrace();
     }
 }
}

当我尝试编译上述程序时,我收到此错误。

UnicodeCheck.java:1: illegal character: \187
class UnicodeCheck {
 ^
UnicodeCheck.java:1: illegal character: \191
class UnicodeCheck {
  ^
2 errors

我不明白这个错误。为什么我会得到这个以及如何克服这个错误?

3 个答案:

答案 0 :(得分:2)

Byte order mark

The byte order mark (BOM) is a Unicode character used to signal the endianness
(byte order) of a text file or stream. Its code point is U+FEFF. BOM use is
optional, and, if used, should appear at the start of the text stream. 
Beyond its specific use as a byte-order indicator, the BOM character may also 
indicate which of the several Unicode representations the text is encoded in.

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

答案 1 :(得分:2)

文件开头的字符来自字节顺序标记,某些文本编辑器喜欢将其插入文件的开头。但是,Java编译器不接受带有BOM的文件。您有两种选择:

  1. 使用文本编辑器,允许在没有 BOM的情况下以Unicode 保存文件,例如Notepad ++。
  2. 在源代码中仅使用ASCII字符。您需要Unicode字符的位置使用\uXXXX - 转义码。 JDK附带了一个实用程序,用于将“本机”文本转换为此编码,称为native2ascii。例如,

    writer.write("غزل");
    

    将转换为

    writer.write("\u063a\u0632\u0644");
    

答案 2 :(得分:0)

它取决于文本编辑器(编辑java源文件的位置)使用的字符集。尝试以UTF-8格式设置它。