我刚刚在Borland JBuilder 2006中获得了一个我甚至无法构建的项目。我有两个资源文件,一个是简体中文文本,另一个是繁体中文。当我尝试构建项目时,文本被误解,并且它看到了“非法转义字符”。
现在如果我在Project中设置编码 - >项目属性 - >一般 - >编码为GB2312,简体中文文本显示正确。然而,繁体中文资源仍然是乱码。
我认为对于繁体中文,此设置应设置为Big5,但即使这样也不起作用。当我将其设置为Big5时,简体中文会被破坏。
之前正在开展工作的开发人员没有机会向我展示如何构建这个项目..
有什么想法吗?
谢谢,
的Kreb
答案 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