eclipseでのエンコードの問題について

2773 ワード

普段、私たちはファイルの読み取りや書き込み時にコードを設定していませんが、毎回正しいファイル内容(中国語)を読み取ることができますか?
最近プロジェクトをして、ローカルとサーバーの間にいつも中国語の表示が一致しない情況が現れることを発見して、例えばサーバーは正常に表示して、しかしローカルは文字化けして表示します.
最後にいくつかのテストを行いました.
まずeclipseに基づいて、テストプロジェクトを構築しました.
Charsetを呼び出す.defaultCharset().name()は、現在UTF-8として符号化されているファイルを取得し、書き込みファイル操作ファイルを行う
		String fileName = "G://abc.xml";
		
		StringBuilder sb = new StringBuilder();
		sb.append("");
		sb.append("");
		sb.append("
"); sb.append(""); 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 , utf-8( )
		// console 
		Document sdoc = saxReader.read(new File(fileName));
		System.out.println("sdoc : 
"+new String(sdoc.asXML().getBytes("utf-8"),"gbk"));

何の処理もしていなければ、contentコンテンツの最初のセグメントencoding='utf-8'がデフォルトの符号化と一致しなければ直接誤りを報告し、gbkに変更すれば正常であり、このときファイルの符号化もgbkであり、読み取ったファイルコンテンツは正常であるが、システムがutf-8符号化であるため、utf-8符号化でバイトに変換されてgbkで正常になる.
ネット上でxmlファイルの読み取りについて調べたところ、まずxml検査に基づいてbomを隠し、次にヘッダencoding、最後にファイル符号化方式でファイルを読み取る.
総括:コードを書く時、私達はすべてコンパイルする時の符号化を設定して、実際に処理する時またgbkの環境があって、この2点の設定が一致しないかもしれなくて、それではその後多くの文字化の問題が存在するかもしれなくて、すべて統一したほうがいいです;次にxmlファイルの読み取りについては,まずファイルに隠されている情報をチェックし,次にヘッダ符号化を行い,最後に上の2つがない場合はファイル符号化に基づいて読み出す.
一つの問題は、eclipse mavenプロジェクトにおいて、例えばmaven-compiler-pluginプラグインを追加し、gbk、Charsetを符号化する.defaultCharset().name()はgbkに対応していますが、このときeclipseのjdkをutf-8に符号化すると、この値がutf-8になります.不思議ですが、mavenコンパイルプラグインはeclipseのjdkについているようです.