我有一小段代码,我将InputStreamReader和OutputStreamWriter链接到文件流,以便更好地理解Java如何处理不同的字符集(或更好,不同的#34;字符编码")。 在这里,我创建一个包含256个字节的文件,表示从0到255的数字 我尝试读取那些字节,就好像它们被编码,例如,Cp855(西里尔文),将它们存储在Java本机字符编码中(我理解为Unicode UTF-16),然后将这些字节转换回字符,这次是Cp1252编码(我的Windows平台'默认编码):
import java.io.*;
class Test {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
if (args.length<2) {
System.out.println("usage: java Test input_encoding output encoding");
return;
}
InputStreamReader isr=null;
OutputStreamWriter osw=null;
try {
File source=new File("source.txt");
source.createNewFile();
populate(source);
FileInputStream fis=new FileInputStream(source);
try {
isr=new InputStreamReader(fis,args[0]);
}
catch (UnsupportedEncodingException en) {
System.out.println("input encoding not supported");
isr=new InputStreamReader(fis);
}
FileOutputStream fos=new FileOutputStream("dest.txt");
try {
osw=new OutputStreamWriter(fos,args[1]);
}
catch (UnsupportedEncodingException en) {
System.out.println("output encoding not supported");
osw=new OutputStreamWriter(fos);
}
while (true) {
int c=isr.read();
if (c == -1) break;
osw.write(c);
}
}
catch (FileNotFoundException ex) {
System.out.println("file error");
return;
}
catch (IOException ex) {
ex.printStackTrace();
}
finally {
if (isr != null)
try {
isr.close();
}
catch (IOException e) {
System.out.println("error closing resources");
}
if (osw != null)
try {
osw.close();
}
catch (IOException e) {
System.out.println("error closing resources");
}
}
}
public static void populate(File file) throws IOException {
FileOutputStream fos=new FileOutputStream(file);
for (int i=0;i<256;++i)
fos.write(i);
fos.close();
}
}
所以我期望的是,两个字符编码不同于128到255(我认为所有代码页共享相同的前128个ASCII字符,然后它们采用他们自己的异乎寻常的方式),Java映射前128个字符正确地从西里尔字符到unicode并返回到cp1252,而我应该得到很多替换字符(问号)来代替西里尔字符集中的字符(当然还有Unicode),但不是在Cp1252中。 相反,我得到了这个:
Ā̂Ԅ܆ईଊഌ༎ᄐጒᔔᤘᬚᴜ℠⌢┤✦⤨⬪⼮㌲㔴㜶㤸㬺㴼㼾䅀䍂䕄䝆䥈䭊䵌低児卒啔坖奘孚嵜彞慠换敤杦楨歪浬潮煰獲畴睶祸筺絼罾㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿뮫㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿ꐿ㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㼿㾭㼿㼿㼿㼿㼿ꜿꀿ
对我来说看起来像中文表意文字...... ????
编辑:现在我在填充文件时关闭流,并在打开输入流之前调用populate(),从而产生更清晰的代码。 但结果是一样的。