空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
           eXtremeComponents的中文的問題,目前知道的就是導出使用中文文件名的亂碼問題,eXtremeComponents已經默認使用UTF來導出XLS,也已經給出了PDF導出的解決方案:最新eXtremeComponents包:支持 PDF中文導出
                   網友seno指出可以參照SpringSide的解決方案,對文件名進行toUtf8編碼。不過,在我自己實際應用中,我的一個應用根本不需要進行任何形式的修正就能正確地生成正確的文件名輸出,如果我在eXtremeComponents添加了toUtf8導出的文件名反而亂碼。所以現在的問題是我什么時候需要對文件名進行toUtf8編碼?這是這段時間一直困擾我的問題,在網友冷月宮主和MagicYang的幫助,昨天經過一整天的查找測試找到了一個暫時看來令我比較滿意的解決方案(暫時沒有CheckIn): 我對得到的文件名字符串使用jchardet(http://jchardet.sourceforge.net/)進行編碼檢測,如果檢測編碼是ASCII碼則直接返回原字符串,否則的話是用SpringSide提供的toUtf8方法(比我原來的簡潔有效)對字符串進行編碼后再返回新的字符串。對應的代碼如下:
              
          /*
           * Copyright 2004 original author or authors.
           *
           * Licensed under the Apache License, Version 2.0 (the "License");
           * you may not use this file except in compliance with the License.
           * You may obtain a copy of the License at
           *
           *    
          http://www.apache.org/licenses/LICENSE-2.0
           *
           * Unless required by applicable law or agreed to in writing, software
           * distributed under the License is distributed on an "AS IS" BASIS,
           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
           * See the License for the specific language governing permissions and
           * limitations under the License.
           
          */
          package org.extremecomponents.table.filter;

          import org.apache.commons.lang.StringUtils;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.extremecomponents.table.context.Context;
          import org.extremecomponents.table.core.TableConstants;
          import org.mozilla.intl.chardet.nsDetector;
          import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
          import org.mozilla.intl.chardet.nsPSMDetector;

          /**
           * 
          @author Jeff Johnston
           
          */
          public final class ExportFilterUtils {
              
          private static Log logger = LogFactory.getLog(ExportFilterUtils.class);
              
          public static boolean found = false;

              
          private ExportFilterUtils() {
              }

              
          public static boolean isExported(Context context) {
                  
          return StringUtils.isNotBlank(getTableId(context));
              }

              
          public static String getExportFileName(Context context) {

                  String tableId 
          = getTableId(context);

                  
          if (StringUtils.isNotBlank(tableId)) {
                      String exportFileNameStr 
          = tableId + "_" + TableConstants.EXPORT_FILE_NAME;
                      String exportFileName 
          = verifyEncoding(context.getParameter(exportFileNameStr));

                      
          if (logger.isDebugEnabled()) {
                          logger.debug(
          "eXtremeTable export file name [" + exportFileNameStr + "] is [" + exportFileName + "]");
                      }

                      
          return exportFileName;
                  }

                  
          return null;
              }

              
          private static String verifyEncoding(String exportFileName) {
                  nsDetector det 
          = new nsDetector(nsPSMDetector.ALL);
                  det.Init(
          new nsICharsetDetectionObserver() {
                      
          public void Notify(String charset) {
                          ExportFilterUtils.found 
          = true;
                      }
                  });

                  
          boolean done = false;
                  
          boolean isAscii = true;
                  
          byte[] buf = exportFileName.getBytes();
                  
          for (int i = 0; i < buf.length; i++) {
                      
          if (isAscii)
                          isAscii 
          = det.isAscii(buf, i);
                      
          if (!isAscii && !done)
                          done 
          = det.DoIt(buf, i, false);
                  }
                  det.DataEnd();

                  
          if (isAscii) {
                      
          return exportFileName;
                  }
                  
          return toUtf8(exportFileName);

              }

              
          public static String toUtf8(String src) {
                  
          byte[] b = src.getBytes();
                  
          char[] c = new char[b.length];
                  
          for (int i = 0; i < b.length; i++) {
                      c[i] 
          = (char) (b[i] & 0x00FF);
                  }
                  
          return new String(c);
              }

              
          /**
               * There can only be one table instance (tableId) per form. If the instance
               * variable exists that means there is an export being done.
               *
               * 
          @param context
               * 
          @return
               
          */
              
          public static String getTableId(Context context) {
                  
          return context.getParameter(TableConstants.EXPORT_TABLE_ID);
              }
          }
                經過我們三個人測試是成功的。歡迎大家幫助測試。大家如果有任何意見、建議可與我聯系: xplucky@gmail.com
                壓縮文件只包含: eXtremeComponents.jar eXtremeComponents.tld 和 jchardet.jar
                 eXtremeComponents.rar  
          posted on 2008-07-09 08:59 蘆葦 閱讀(442) 評論(0)  編輯  收藏 所屬分類: JAVA
          主站蜘蛛池模板: 喀什市| 丹凤县| 绵阳市| 碌曲县| 云林县| 娄底市| 昌江| 安溪县| 新安县| 苗栗县| 普陀区| 昆山市| 绥滨县| 木兰县| 广昌县| 社旗县| 宁德市| 宁海县| 邢台县| 武鸣县| 铜陵市| 永昌县| 保康县| 乡宁县| 万荣县| 武胜县| 乐平市| 雷波县| 铁岭县| 张家界市| 沁源县| 定日县| 通城县| 遂宁市| 卢龙县| 南城县| 厦门市| 龙门县| 惠东县| 佛山市| 沈丘县|