1

Borland JBuilder 2006 でビルドできないプロジェクトを取得しました。簡体字中国語と繁体字中国語の 2 つのリソース ファイルがあります。プロジェクトをビルドしようとすると、テキストが誤って解釈され、「不正なエスケープ文字」が表示されます。

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 がファイルに使用するエンコーディングを設定するには、ファイルを右クリックして [プロパティ] を選択します。エンコーディングは Resource プロパティの下にあります。これは管理が難しく、使用する外部ツール (Ant ビルド スクリプトなど) には適用されません。

外部を使用して別のエンコーディングを使用してファイルをコンパイルすることは可能です。例えば:

javac -encoding GB18030 Foo.java

しかし、これらのクラスに相互依存性がある場合、それはすぐに苦痛になります。


複数のエンコーディングに直面した場合、すべてのファイルを 1 つのエンコーディングに変換します。ここにはいくつかのオプションがあります。

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

メモ帳で開くと、ロケールが中国語 (PRC) に設定されているだけでも、両方を正しく表示できます。

メモ帳は、ヒューリスティックな文字エンコード検出メカニズムを使用します。いつもうまくいくとは限りません

于 2009-07-21T10:08:23.813 に答える