1

我刚刚在 Borland JBuilder 2006 中获得了一个我什至无法构建的项目。我有两个资源文件,一个是简体中文,另一个是繁体中文。当我尝试构建项目时,文本被误解并且看到“非法转义字符”。

现在如果我在 Project -> Project Properties -> General -> Encoding 中设置编码为 GB2312,简体中文文本显示正确。但是繁体中文资源仍然是乱码。

我认为对于繁体中文,此设置应该设置为 Big5,但即使这样也不起作用.. 当我将其设置为 Big5 时,简体中文会被破坏。

之前从事此工作的开发人员没有机会向我展示如何构建这个项目就离开了。

有任何想法吗?

谢谢,

克雷布

4

1 回答 1

1

它们被称为“Res_SChinese.java”和“Res_TChinese.java”

我假设这些必须是 Java 类文件,尽管我很惊讶它们采用不同的编码。

具有多种编码的源文件是非常不可取的。如果您不知道源文件有哪些字符集,可以使用ICU 项目库来帮助您猜测

  public static void main(String[] args) throws IOException {
    InputStream file = new FileInputStream(args[0]);
    try {
      file = new BufferedInputStream(file);
      CharsetDetector detector = new CharsetDetector();
      detector.setText(file);
      String tableTemplate = "%10s %10s %8s%n";
      System.out.format(tableTemplate, "CONFIDENCE",
          "CHARSET", "LANGUAGE");
      for (CharsetMatch match : detector.detectAll()) {
        System.out.format(tableTemplate, match
            .getConfidence(), match.getName(), match
            .getLanguage());
      }
    } finally {
      file.close();
    }
  }

请注意,它可以检测到的汉字编码数量是有限的(ISO-2022-CN、GB18030 和 Big5),但至少它可以帮助您找出所有内容是否只是以 Unicode 转换格式或其他格式编码。


Eclipse(JBuilder 现在是基于 Eclipse 的,不是吗?)可以为单个文件设置编码。您可以通过右键单击文件并选择“属性”来设置 Eclipse 用于文件的编码。编码位于资源属性下。这很难管理,并且不适用于您使用的任何外部工具(如 Ant 构建脚本)。

可以使用外部使用不同的编码来编译文件。例如:

javac -encoding GB18030 Foo.java

但是,如果这些类具有相互依赖关系,那将很快变得痛苦。


面对多种编码,我会将所有文件转换为一种编码。这里有几个选项。

使用 Latin-1 子集

Java 在源文件中支持 Unicode 转义序列。因此,Unicode 字符 U+6874 桴可以写成文字 \u6874。JDK 工具native2ascii可用于将 Java 文件转换为 Latin-1 值。

native2ascii -encoding GB2312 FooIn.java FooOut.java

生成的文件可能会毫无问题地在任何地方编译,但对于任何阅读/编辑文件的人来说可能是一场噩梦。

使用GB18030

GB18030是一个巨大的字符集,所以如果这是您的本机编码,那么使用它可能是一个好主意(否则,如果我走这条路,我会使用 UTF-8)。

您可以使用这样的代码来执行转换:

  public static void main(String[] args) throws IOException {
    changeEncoding("in_cn.txt", Charset.forName("GBK"),
        "out_cn.txt", Charset.forName("GB18030"));
  }

  private static void changeEncoding(String inFile,
      Charset inCharset, String outFile, Charset outCharset)
      throws IOException {
    InputStream in = new FileInputStream(inFile);
    Reader reader = new InputStreamReader(in, inCharset);
    OutputStream out = new FileOutputStream(outFile);
    Writer writer = new OutputStreamWriter(out, outCharset);
    copy(reader, writer);
    writer.close();
    reader.close();
    // TODO: try/finally blocks; proper stream handling
  }

  private static void copy(Reader reader, Writer writer)
      throws IOException {
    char[] cbuf = new char[1024];
    while (true) {
      int r = reader.read(cbuf);
      if (r < 0) { break; }
      writer.write(cbuf, 0, r);
    }
  }

如果我在记事本中打开它们,即使将语言环境设置为中文(中国),我也可以正确查看它们

记事本使用启发式字符编码检测机制。它并不总是有效

于 2009-07-21T10:08:23.813 回答