我刚刚在Borland JBuilder 2006上得到了一个我甚至不能构建的项目。我有两个资源文件,一个是简体中文,另一个是繁体中文。当我尝试构建这个项目时,文本被误解了,它看到了一个“非法转义字符”。
现在,如果我在->项目属性->常规->编码中将编码设置为GB2312,简体中文文本可以正确显示。然而,传统的中国资源仍然是乱码。
我认为对于繁体中文,这个设置应该设置为Big5,但即使这样也不起作用。当我将其设置为Big5时,简体中文就会损坏。
之前负责这个项目的开发人员在没有机会向我展示如何构建这个项目的情况下离开了。
有什么想法吗?
谢谢,
克雷布
发布于 2009-07-21 10:08:24
他们被称为"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的,不是吗?)可以为单个文件设置编码。您可以通过右键单击文件并选择Properties来设置Eclipse对该文件使用的编码。编码位于资源属性下。这很难管理,并且不适用于您使用的任何外部工具(如Ant构建脚本)。
可以使用external编译使用不同编码的文件。例如:
javac -encoding GB18030 Foo.java但是,如果这些类具有相互依赖关系,那么很快就会变得令人痛苦。
面对多个编码,我会将所有文件转换为一种编码。这里有几个选项。
使用拉丁-1子集
Java支持源文件中的Unicode转义序列。因此,Unicode字符U+6874桴可以写为文字\u6874。可以使用JDK工具native2ascii将Java文件转换为拉丁-1值。
native2ascii -encoding GB2312 FooIn.java FooOut.java生成的文件可能会在任何地方编译,没有问题,但对于任何阅读/编辑文件的人来说,这可能是一场噩梦。
使用GB18030
GB18030是一个巨大的字符集,所以如果这是您的原生编码,那么使用它可能是一个好主意(否则,如果我采用这种方法,我会使用UTF8)。
您可以使用如下代码来执行转换:
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);
}
}如果我在记事本中打开它们,我可以正确地查看它们,即使区域设置为中文(中国)
记事本使用启发式字符encoding detection机制。It doesn't always work。
https://stackoverflow.com/questions/1152612
复制相似问题