JBuilder 2006多种编码

时间:2009-07-20 09:35:10

标签: java jbuilder

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

现在如果我在Project中设置编码 - >项目属性 - >一般 - >编码为GB2312,简体中文文本显示正确。然而,繁体中文资源仍然是乱码。

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

之前正在开展工作的开发人员没有机会向我展示如何构建这个项目..

有什么想法吗?

谢谢,

的Kreb

1 个答案:

答案 0 :(得分:1)

  

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

我认为这些必须是Java类文件,尽管我对它们采用不同的编码感到惊讶。

使用多个编码的源文件是非常不受欢迎的。如果您不知道源文件包含哪些字符集,可以使用ICU project库来帮助您guess

  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 and Big5),但至少它可以帮助您查明是否所有内容都只是以Unicode转换格式编码。


Eclipse(JBuilder现在基于Eclipse,不是吗?)可以为单个文件设置编码。您可以通过右键单击文件并选择“属性”来设置Eclipse用于文件的编码。编码位于Resource属性下。这很难管理,也不适用于您使用的任何外部工具(如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)。 / p>

您可以使用此类代码执行转换:

  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);
    }
  }

  

如果我在记事本中打开它们,即使只将区域设置设置为中文(PRC),我也能正确查看它们

记事本使用启发式字符encoding detection机制。 It doesn't always work