<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

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

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

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

    最初的亂碼問題.

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

    解決:在JSP頁面上方加個<%@ page contentType="text/html;charset=utf-8"%>解決。當然,也可以用charaset="gbk","gb2312"之類的編碼,不過建議還是用utf-8,詳細原因去看看jdon板橋里人的那篇《中文亂碼終極解決方法》。

     *****************************************************************************

    2.提交表單,在后臺讀取表單內(nèi)容發(fā)現(xiàn)亂碼

    原因: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后加入以下內(nèi)容:

     <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內(nèi)的

        <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數(shù)據(jù)庫EMS顯示亂碼,讀回數(shù)據(jù)也是亂碼

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

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

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

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

    解決:register數(shù)據(jù)庫時,client default  charater set改utf-8

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

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

    原因:common-upload組件默認采用系統(tǒng)的編碼,而頁面?zhèn)鬟^來的請求采用UTF-8編碼。

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

    解決:網(wǎng)上的說法五花八門,甚至有歸罪于這是UPLOAD的BUG,其實只要在

     DiskFileUpload fu = new DiskFileUpload();

    后加一句:

    fu.setHeaderEncoding("utf8");

    就解決了。。。

    看來有時候還是直接讀英文幫助手冊來得正確。。。




    問題描述:
    在inputtext中輸入中文,然后在輸出,顯示為亂碼。

    解決方法:
    1、自定義轉(zhuǎn)器
    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、注冊轉(zhuǎn)換器
    faces-config.xml片段
    <converter>
      <converter-id>stringconverter</converter-id>
      <converter-class>util.StringConverter</converter-class>
    </converter>

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

    </h:inputText>





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

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

    而查看html源代碼如下:

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

    我們發(fā)現(xiàn)用jsf標簽出來的有內(nèi)碼,而不是jsf標簽的就沒事。(網(wǎng)頁服務(wù)器編碼等都是UTF-8統(tǒng)一的)。

    那么有什么辦法呢?

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

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

    第三種方法是我自己研究出來的,通過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,就這么簡單^_^。。。

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

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

    評論:
    # re: [轉(zhuǎn)]JSF中文輸入亂碼問題解決方法[未登錄] 2015-03-02 20:34 | kkk
    贊一個  回復(fù)  更多評論
      
    # re: [轉(zhuǎn)]JSF中文輸入亂碼問題解決方法 2016-06-08 15:38 | 啊速度發(fā)
    個體gay特權(quán) 讓我去聽聽 天慶 4安琪兒 我去而他卻讓他 企鵝問題探討去 去問問情人 如圖切爾奇請問天然氣熱天氣額  回復(fù)  更多評論
      
    主站蜘蛛池模板: 97热久久免费频精品99| 久久精品成人免费观看97| 波多野结衣中文字幕免费视频| 亚洲AV无码国产精品色午友在线| 中文字幕免费在线观看动作大片| 亚洲伊人久久综合影院| 好猛好深好爽好硬免费视频| 国产91精品一区二区麻豆亚洲| 一级毛片免费在线观看网站| 在线精品亚洲一区二区小说| a级片免费观看视频| 内射干少妇亚洲69XXX| 7m凹凸精品分类大全免费| 亚洲无成人网77777| 在线观看av永久免费| 亚洲大码熟女在线观看| 免费国产成人午夜私人影视| 成年大片免费高清在线看黄| 亚洲精品蜜桃久久久久久| 69视频在线是免费观看| 亚洲人成www在线播放| 亚洲国产成人久久综合野外| 日韩电影免费在线观看| 亚洲av无码电影网| 亚洲高清无码综合性爱视频| 免费网站看av片| 亚洲av一本岛在线播放| 免费在线一级毛片| 久久精品视频免费看| 色老板亚洲视频免在线观| 亚洲成AⅤ人影院在线观看| 丁香花在线视频观看免费| 亚洲一级毛片中文字幕| 亚洲福利视频一区二区| 50岁老女人的毛片免费观看| 亚洲AV无码成人网站在线观看| 最新国产AV无码专区亚洲| 人与禽交免费网站视频| 免费手机在线看片| 亚洲视频在线免费播放| 亚洲成av人片不卡无码久久|