一、
IO的乱码往往出现字符流中,可在字节流向字符流转换的时候处理,如:
new InputStreamReader(new FileInputStream(file),"UTF-8")
二、
或者直接使用字节流
new String(sb.toString().getBytes("ISO-8859-1"), "UTF-8")//注:sb是字节流的简单拼装
在字节转向字符流时,如果不指定则默认取自入口函数所在的JAVA文件的编码值。分析如下:
//在创建时可以指定字符集
public InputStreamReader(InputStream in, String charsetName){
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
//如果没有指定则获取默认值
public static StreamDecoder forInputStreamReader(InputStream inputstream, Object obj, String s){
String s1 = s;
if(s1 == null)
s1 = Converters.getDefaultEncodingName();
if(!Converters.isCached(0, s1))
。。。
}
//默认值来自System.getProperty
public static String getDefaultEncodingName(){
GetPropertyAction getpropertyaction = new GetPropertyAction("file.encoding");//这里取自System.getProperty(变量)
return defaultEncoding;
}
System.getProperty值的来源:首先并不是操作系统os的默认编码
问题1:file.encoding的值是什么呢? 这个一开始我认为是操作系统的编码
但我错了,它的值为保存每个程序的main入口的那个java文件的保存编码(点击文件-->属性-->text file encoding(other的值),这是使用eclipse 编译器)
通过以下的代码即可证明:
/**
* Test.java源代码文件
*/
public class Test {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
//Test2.printEncoding();
}
}
1、文件保存的编码为:GB2312 时
编译执行之后,得到的结果为:
GB2312 |
2、文件保存的编码为:GBK 时
编译执行之后,得到的结果为:
GBK |
3、文件保存的编码为:UTF-8时
编译执行之后,得到的结果为:
UTF-8 |
从上面的三个结果可以看出,file.encoding的值并不是操作系统os的默认编码
而是main入口函数所在的类的保存编码.
但是这时想到了另一个问题,
问题2:是不是每个java文件都有自己的file.encoding呢?
于是我写了另一个类做试验,添加了类文件Test2.java
/**
* Test2.java源代码文件
*/
public class Test2 {
public static void printEncoding(){
System.out.println(System.getProperty("file.encoding"));
}
}
并将源文件Test.java的代码修改为:
/**
* Test.java源代码文件
*/
public class Test {
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
Test2.printEncoding();//添加了这个命令
}
}
这时我将Test.java的保存编码设置为:utf-8
将Test2.java的保存编码设置为:GBK
根据问题2我最原始的假设那么
编译运行这两个文件之后得到的结果应该为:
utf-8 GBK |
但事实是运行后的结果为:
utf-8 utf-8 |
于是得出了结论是:
在一个运行的应用程序中
file.encoding的值只有一个,并且值为入口函数的保存编码的值
2179

被折叠的 条评论
为什么被折叠?



