JSF中国語入力文字化けし問題解決方法
ここ数年来出会った中国語の問題をまとめます.
注意:次の「バックグラウンド」は、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フラグメントstringconverter util.StringConverter
3、ページでコンバータ
JSFは生まれながらにしてこの欠点であると推定され、jsfラベルで生成されたhtmlコードに中国語のもの(backbeanから抽出されたものを指す)があり、htmlソースコードに類似している:雨・28404; このような「漢字内符号」、例えばjsfの符号は、
ハハハ
ハハハ
ブラウザは以下のように表示します:雨滴雨滴2ハハハハ
htmlソースコードを表示するには、次のようにします.
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日探しても合理的な解決方法が見つからず、この方法でやっと解決しました.の
注意:次の「バックグラウンド」は、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の後に次の内容を追加します.
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フラグメント
3、ページでコンバータ
JSFは生まれながらにしてこの欠点であると推定され、jsfラベルで生成されたhtmlコードに中国語のもの(backbeanから抽出されたものを指す)があり、htmlソースコードに類似している:雨・28404; このような「漢字内符号」、例えばjsfの符号は、
ハハハ
ハハハ
ブラウザは以下のように表示します:雨滴雨滴2ハハハハ
htmlソースコードを表示するには、次のようにします.
雨滴雨滴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日探しても合理的な解決方法が見つからず、この方法でやっと解決しました.の