JSF中国語入力文字化けし問題解決方法

6736 ワード

ここ数年来出会った中国語の問題をまとめます.
注意:次の「バックグラウンド」は、servlet内、またはクラス内、またはstrutsのaction内に相当します.
1.バックグラウンドでシステムを使用する文字列.out.println出力は正常で、sessionに保存してJSPページに文字化けしを表示します
最初の文字化けし問題
理由:デフォルトのJSPページは8859-1符号化されているようで、中国語は表示されません.
解決:JSPページに<%@page contentType="text/html;charset=utf-8"%>を付けて解決します.もちろん、charaset=「gbk」、「gb 2312」などの符号化も可能ですが、utf-8を使って、jdon板橋里人の「中国語乱符号究極の解決方法」を詳しく見てみることをお勧めします.
 *****************************************************************************
2.フォームを提出し、バックグラウンドでフォームの内容を読み取って文字化けしを発見する
理由:requestのデフォルト符号化の問題は、具体的にはよくわかりませんが、tomcatソースコードを見たことがありません.の
解決:次のようにfileterを書きます.
package operator;
import java.io.IOException;
import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {  protected String encoding = null;
 protected FilterConfig filterConfig = null;
 public void init(FilterConfig filterConfig) throws ServletException {   this.filterConfig = filterConfig;   this.encoding = filterConfig.getInitParameter("encoding");  }
 public void doFilter(ServletRequest request, ServletResponse response,    FilterChain chain) throws IOException, ServletException {   request.setCharacterEncoding("UTF-8");   chain.doFilter(request, response);  }
 public void destroy() {   this.encoding = null;   this.filterConfig = null;  }
 protected String selectEncoding(ServletRequest request) {   return (this.encoding);  } }
web.xml構成:
servlet-mappingの後に次の内容を追加します.
    Set Character Encoding   operator.SetCharacterEncodingFilter        encoding    UTF-8     
    Set Character Encoding   /*   ***********************************************************************
3.ダウンロード時、「名前を付けて保存」デフォルトの名前が文字化けして表示される
原因:よくわかりません...
tomcatにディレクトリのconfig/severをインストールします.xml内の
   
最後の"URIEncoding="UTF 8"を追加
4.バックグラウンドでシステムを使う.out.println()の出力は正常で、mysqlデータベースEMSに保存して文字化けしを表示して、データを読み返しても文字化けしです
原因:mysqlのデフォルトはlatin 1符号化を採用しています.
解決:テーブルを作成するときはutf-8に変更します.既にテーブルが存在する場合は、EMSを使用する場合は、table-property内のdefault charater setを直接修正すればよいのですが、他の管理ツールはわかりませんので、使用したことはありません.
5.バックグラウンドでシステムを使う.out.println()出力は正常で、mysqlデータベースEMSに保存して文字化けしを表示して、データを読み返す時——意外にも正常で、直接データベースの中に正常な中国語を挿入して、読み出します——意外にも文字化けしました;
理由:EMS管理ツールのデフォルト表示の問題
解決:registerデータベースの場合、client default charater setはutf-8を変更します.
注:この死に物狂いの問題は私を長い間悩ませて、ずっと私のプログラムに問題があると思って、N久を検査して、意外にもツールの表示の問題であることを発見しました.
6.COMMON-UPLOADが中国語名ファイルをアップロードする時、文字化けしを表示する
理由:common-uploadコンポーネントはデフォルトでシステムの符号化を採用し、ページからの要求はUTF-8符号化を採用している.
私のシステムは簡体字中国語WINDOWS 2 K 3で、システムコードはGBKで、ページが要求する時、UPLOADはUTF 8コードのストリームを直接GBKコードしました.new String(oldStr.getBytes(「gbk」)を使用すると、「utf 8」が発見され、一部の中国語が復元されます.
解决:ネット上では様々な言い方があり、UPLOADのBUGのせいにすることもあるが、実は
 DiskFileUpload fu = new DiskFileUpload();
次の文を追加します.
fu.setHeaderEncoding("utf8");
解決しました...
時々英語のヘルプマニュアルを直接読んで正しいようです.の
問題の説明:
inputtextに中国語を入力し、出力し、文字化けして表示します.
解決方法:
1、カスタムローター
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
public class StringConverter implements Converter {  public Object getAsObject(FacesContext context, UIComponent component,    String newValues) throws ConverterException {   String newstr = "";   if (newValues == null) {    newValues = "";   }   byte[] byte1 = null;   try {    byte1 = newValues.getBytes("ISO-8859-1");    newstr = new String(byte1, "GB2312");    UIInput input=(UIInput)component;//   input.setSubmittedValue(newstr);   } catch (UnsupportedEncodingException e) {    e.printStackTrace();   }
  return newstr;
 }
 public String getAsString(FacesContext context, UIComponent component,    Object Values) throws ConverterException {    return (String) Values;  } }
2、変換器faces-configを登録する.xmlフラグメントstringconverterutil.StringConverter
3、ページでコンバータ

JSFは生まれながらにしてこの欠点であると推定され、jsfラベルで生成されたhtmlコードに中国語のもの(backbeanから抽出されたものを指す)があり、htmlソースコードに類似している:雨・28404; このような「漢字内符号」、例えばjsfの符号は、
ハハハ

ハハハ
ブラウザは以下のように表示します:雨滴雨滴2ハハハハ
htmlソースコードを表示するには、次のようにします.
&#38632;&#28404;&#38632;&#28404;2
<br>
  
<br>  

jsfラベルではなく、jsfラベルで出てくる内コードがあれば大丈夫であることが分かった.(ウェブサーバコードなどはUTF-8で統一されている).
では、どうすればいいのでしょうか.
最初の方法は、カスタムConverterを書くことです.jsfにはこのような機能がありますが、converterを書くことをテストしました.しかし、効果は私を失望させました.jsfの内在論理が漢字を内符号にした場所がconverterの後、私はconverterに何かを追加し、htmlソースコードには内符号であることに気づいたからです.あきらめて
第2の方法はサーブレットのFilterフィルタを書いてwebに置くことです.xml中ですが、漢字内コード雨前後の落下を取り除き、これらの数字をcharに変えてStringにする必要があります.すべての字はこのような方法で戻ってきて、このように自身の効率が低くて、しかも1つのhtmlドキュメントの中でjsfで表示する内容の占有比率がどれだけ少ないか、ラベルがないのもこのフィルタで1つの字1つの字で解析を取るならば、効率は更にお世辞を言う勇気がありません.この方法は必ず実行できる(フィルタは出力の最後のステップに着くことができるため)が、効率の問題のため、私は試していない.
3つ目の方法は、まず、クラスpublic class Converter{public static void process(String str){FacessContext fc=FacessContext.getCurrentInstance();try{fc.getResponseWriter().write(str);   } catch (IOException e) {    //TODO Auto-generated catch block     e.printStackTrace(); その後、backbean毎にgetXXXメソッドを返す必要があるのはStringのメソッドである.return XXXをreturn"に変更する.returnの前、すなわちメソッドの最後のステップにConverterを追加する.process(testValue)、このtestValueはあなたがreturnする変数okで、このように簡単です^^...
ネットで1日探しても合理的な解決方法が見つからず、この方法でやっと解決しました.の