それらは「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) に設定されているだけでも、両方を正しく表示できます。
メモ帳は、ヒューリスティックな文字エンコード検出メカニズムを使用します。いつもうまくいくとは限りません。