java开发编程及工程部署中编码问题

public static void currentSystemChartSet(){
		System.out.println("Default Charset: " + Charset.defaultCharset());
		System.out.println("file.encoding: " + System.getProperty("file.encoding"));
		System.out.println("sun.jnu.encoding: "+System.getProperty("sun.jnu.encoding")); 
		System.out.println("Default Charset in Use: " + (new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding()));
		
		BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
		BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,encoding));//最好写成这种样式
	}

输出结果:
Default Charset: UTF-8
file.encoding: UTF-8
sun.jnu.encoding: GBK
Default Charset in Use: UTF8


1.Charset.defaultCharset(),获取的语言环境的编码到底是哪里来的
是eclipse默认编码的问题;修改既可以。如下图
java开发编程及工程部署中编码问题_第1张图片
但是这就是问题了:线上是放在tomcat中的。没有eclipse。你说Charset.defaultCharset() 读取是哪里的语言环境的编码呢?
补充:tomcat没有默认语言编码。可以设置conf/server.xml文件中Connector 标签;设置
可以修改环境变量:
变量名:JAVA_TOOL_OPTIONS变量值:-Dfile.encoding=UTF-8
java开发编程及工程部署中编码问题_第2张图片

Charset.defaultCharset()默认读取还是配置的语言编码;也是就是系统的;
在java中,一切存储在硬盘上的数据都是二进制的字节,当我们从硬盘读取到字节数组后,如果我们需要把字节    数组转化成String类型的字符串,字节数组需要遵守一定的规则才能正确的转化为字符串,这就用到了编码 :charset。
1、如果使用了eclipse,由java文件的编码决定
2、如果没有使用eclipse,则有本地电脑语言环境决定,中国的都是默认GBK编码


2.System.getProperty("file.encoding")
以前一直以为file.encoding的编码就是系统的编码,直到最近碰见一个怪异的情况:WEB工程中通过上述代码打印出来的编码是GB18030,而登录Linux服务器执行locale或者vi /etc/sysconfig/i18n查出来的编码是UTF-8,竟然两者不一致,一度怀疑是不是服务器编码变了,引发了这篇文章的思考。
file.encoding的值保存的是每个程序的main入口的那个Java文件的保存编码,是.java文件的编码。

3.System.getProperty("sun.jnu.encoding")
sun.jnu.encoding 影响文件名的创建、类名的读取和Main方法参数的读取
参考:http://huangyunbin.iteye.com/blog/2356505  http://blog.csdn.net/youling_lh/article/details/9475519

参考:http://blog.csdn.net/bxyz1203/article/details/7352864 http://blog.csdn.net/u010234516/article/details/52842170
http://blog.csdn.net/loongshawn/article/details/50918506 http://blog.csdn.net/spritenet/article/details/5650622


你可能感兴趣的:(Java学习)