关于eclipse中编码问题

平时我们在读取文件或写入文件时,都没有设置其编码,那么是不是每次都能读取到正确的文件内容(中文)?

最近做项目,发现本地和服务器间总是出现中文显示不一致的情况,比如服务器显示正常,但是本地却显示乱码。

最后就做了些测试:

首先基于eclipse,建了个测试项目

通过调用Charset.defaultCharset().name() 获取到当前编码为UTF-8,然后进行了写文件操作文件

		String fileName = "G://abc.xml";
		
		StringBuilder sb = new StringBuilder();
		sb.append("<?xml version='1.0' encoding='utf-8'?>");
		sb.append("<html>");
		sb.append("<div id='did' name='你好'></div>");
		sb.append("</html>");
		String content = sb.toString();
		
		FileOutputStream fos = new FileOutputStream(fileName);
		
		fos.write(content.getBytes());//文件字符 utf-8
		
		fos.close();
内容写入文件,打开文件中文正常,编码为utf-8,没有问题

此时在配置中把当前项目引用的jdk加上参数-Dfile.encoding=GBK,进行以上操作,文件编码编程gbk,

看样子在写文件时默认使用的编码与我们使用的jdk设置的编码直接又关系。

那么现在再做一件事,把刚content直接通过以下方法读取

		Document doc = DocumentHelper.parseText(content);
		System.out.println(doc.asXML());
出现了乱码,原来本地编译设置的是UTF-8,那么我们的代码包含字符串都是以utf-8的方式编码的,刚设置的bgk为系统默认的读取方式,修改如下:

		Document doc = DocumentHelper.parseText(new String(content.getBytes("utf-8"),"gbk"));
		System.out.println(doc.asXML());
这个时候就一切正常了。所以当前代码编译编码和文件默认读取编码是不相关的。

最后再做一件事:

		SAXReader saxReader = new SAXReader();
		//根据xml头<?xml version='1.0' encoding='utf-8'?>对应的编码读取xml文件,读取后为utf-8(编译环境编码)
		//在console上显示的
		Document sdoc = saxReader.read(new File(fileName));
		System.out.println("sdoc : \n"+new String(sdoc.asXML().getBytes("utf-8"),"gbk"));

如果没有做任何处理,刚content内容的第一段encoding='utf-8'如果和默认编码不一致直接报错,修改为gbk就正常,此时文件的编码也是gbk,读取到的文件内容是正常的,但是由于系统是utf-8编码,所有转换以utf-8编码装好成字节在以gbk就正常了。

网上查了下 关于xml文件读取,首先是根据xml检查隐含bom,其次是头encoding,最后是文件编码方式对文件读取。


总结:在编写代码时,我们都会设置编译时的编码,实际处理时又会有gbk的环境,可能这两点设置不一致,那么之后可能存在很多乱码问题,所有最好统一;其次关于xml文件的读取,首先检查文件隐含信息,其次才是头编码,最后如果上面两个都没有就是根据文件编码读取。


一个问题,在eclipse maven项目中,比如添加了maven-compiler-plugin插件,设置编码gbk,Charset.defaultCharset().name()对应gbk,但是这个时候修改了eclipse的jdk编码为utf-8,这个值就变成utf-8,很是奇怪,看样子maven编译插件是跟着eclipse的jdk走的。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值