<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-9  評論-168  文章-266  trackbacks-0

    以下總結這段時間以來遇到的中文問題匯集:

    注:以下“后臺”字眼,相當于在servlet內,或者某一個類內,或者struts的action內。

    1.一字符串在后臺用system.out.println輸出正常,保存在session里到JSP頁面顯示亂碼

    最初的亂碼問題.

    原因:似乎是默認的JSP頁面采用8859-1編碼,顯示不了中文。

    解決:在JSP頁面上方加個<%@ page contentType="text/html;charset=utf-8"%>解決。當然,也可以用charaset="gbk","gb2312"之類的編碼,不過建議還是用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后加入以下內容:

     <filter>
      <filter-name>Set Character Encoding</filter-name>
      <filter-class>operator.SetCharacterEncodingFilter</filter-class>
       <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
      </init-param>
     </filter>

     <filter-mapping>
      <filter-name>Set Character Encoding</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>
    ***********************************************************************

    3.下載時,“另保存為”默認名字顯示亂碼

    原因:不清楚。。。

    在tomcat安裝目錄的config/sever.xml內的

        <Connector
    port="80"               maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" redirectPort="8443" acceptCount="100"
                   connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

    加進最后的“URIEncoding="UTF8"

    4.在后臺用system.out.println()輸出正常,保存到mysql數據庫EMS顯示亂碼,讀回數據也是亂碼

    原因:mysql默認采用的是latin1編碼;

    解決:創建表的時候要修改成utf-8。如果已存在表,用EMS的話,直接修改table-property里面的default charater set就可以了,其他管理工具不知道,沒用過。

    5.在后臺用system.out.println()輸出正常,保存到mysql數據庫EMS顯示亂碼,讀回數據時——居然正常了,直接往數據庫里插入正常的中文,讀出——居然亂碼了;

    原因:EMS管理工具的默認顯示問題

    解決:register數據庫時,client default  charater set改utf-8

    注:這該死的問題困擾了我好長一段時間,一直以為我程序有問題,檢查了N久,發現居然是工具顯示問題。。

    6.COMMON-UPLOAD 上傳中文名文件時,顯示亂碼

    原因:common-upload組件默認采用系統的編碼,而頁面傳過來的請求采用UTF-8編碼。

    我的系統是簡體中文WINDOWS 2K3,系統編碼是GBK,當頁面請求過來時,UPLOAD就把UTF8編碼的流直接按GBK編碼了。。。如果用new String(oldStr.getBytes("gbk"),"utf8)可以發現,部分中文可以還原回去。

    解決:網上的說法五花八門,甚至有歸罪于這是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片段
    <converter>
      <converter-id>stringconverter</converter-id>
      <converter-class>util.StringConverter</converter-class>
    </converter>

    3、在頁面使用轉換器
    <h:inputText id="account" value="#{util.account}" required="true" styleClass="input" > 
     <f:converter converterId="stringconverter"/>                                                                       <!--注:這里不是EL表達式-->

    </h:inputText>





          JSF估計是天生就是這個毛病,凡是有jsf標簽生成的html代碼中有中文的(指從 backbean中提取出來的),在html源代碼中回出現類似:&#38632;&#28404; 這種“漢字內碼”,比如jsf的代碼如下:
    <f:view>
       <h:outputText value="#{testBean.testValue}"></h:outputText>
       <br>
       哈哈
    </f:view>
    <br>呵呵

    瀏覽器顯示如下:
    雨滴雨滴2
    哈哈
    呵呵

    而查看html源代碼如下:

    &#38632;&#28404;&#38632;&#28404;2
    <br>
    哈哈
    <br>呵呵

    我們發現用jsf標簽出來的有內碼,而不是jsf標簽的就沒事。(網頁服務器編碼等都是UTF-8統一的)。

    那么有什么辦法呢?

    第一個方法,寫一個自定義的Converter,在jsf中有這種功能,但是我測試了寫了一個converter,但是效果令我失望,因為我發現jsf的內在邏輯把漢字變成內碼的地方在converter以后,我在converter中添加什么東西,在html源代碼中還是內碼。于是放棄

    第二種方法是在寫個Servlet的Filter過濾器,放到web.xml中,但是由于漢字內碼&#38632;需要去掉前后墜,然后把這幾個數字變成char,在變成String。每個字都用這種方法變回來,這樣本身效率回很低,而且一個html文檔中用jsf顯示的內容占有比率有多有少,如果沒有標簽的也是用這個過濾器一個字一個字取解析,那么效率就更不敢恭維了。雖然這種方法一定可行(因為過濾器可以到輸出的最后一步),但是由于效率問題,我沒有取試。

    第三種方法是我自己研究出來的,通過FacesContext類來作,方法如下:
    首先,寫一個類
    public class Converter {
    public static void process(String str){
       FacesContext fc=FacesContext.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,就這么簡單^_^。。。

    在網上找了一天沒找到合理解決方法,用這個方法終于解決了。。

    posted on 2008-05-21 09:50 紫蝶∏飛揚↗ 閱讀(4514) 評論(2)  編輯  收藏 所屬分類: JSF重點數據轉換

    評論:
    # re: [轉]JSF中文輸入亂碼問題解決方法[未登錄] 2015-03-02 20:34 | kkk
    贊一個  回復  更多評論
      
    # re: [轉]JSF中文輸入亂碼問題解決方法 2016-06-08 15:38 | 啊速度發
    個體gay特權 讓我去聽聽 天慶 4安琪兒 我去而他卻讓他 企鵝問題探討去 去問問情人 如圖切爾奇請問天然氣熱天氣額  回復  更多評論
      
    主站蜘蛛池模板: 亚洲VA中文字幕无码一二三区 | 久久精品亚洲综合一品| 亚洲中文字幕AV在天堂| 亚洲高清视频免费| 亚洲国产福利精品一区二区| 久久综合给合久久国产免费| 亚洲今日精彩视频| 亚洲精品视频在线免费| 亚洲人成黄网在线观看| 成人超污免费网站在线看| 亚洲熟女综合一区二区三区| 日本高清免费不卡视频| 人妻无码中文字幕免费视频蜜桃| av网站免费线看| 国产午夜亚洲精品午夜鲁丝片| 久久亚洲一区二区| 青青操免费在线视频| 亚洲AV无码一区东京热| 182tv免费观看在线视频| 亚洲av无码一区二区三区观看| 国产乱子伦精品免费视频| 亚洲日韩精品一区二区三区无码 | 亚洲一区二区三区在线视频| 久久九九免费高清视频| 亚洲视频2020| 日本高清免费不卡在线| 九九99热免费最新版| 亚洲色av性色在线观无码| 超pen个人视频国产免费观看| 亚洲国产精品久久久久网站| 免费观看无遮挡www的小视频| 亚洲无码日韩精品第一页| 久久这里只精品热免费99| 国产色在线|亚洲| 国产成人精品亚洲精品| 在线日本高清免费不卡| 亚洲日韩久久综合中文字幕| 亚洲欧洲日产国码一级毛片| 99精品视频免费在线观看| 免费在线观看亚洲| 亚洲综合一区二区国产精品|