幸せのちから

          平凡的世界
          看似平常實崎嶇
          成如容易卻艱辛

          eXtremeComponents導出時的中文文件名問題

          ??? ??? 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 2006-04-08 18:03 Lucky 閱讀(3016) 評論(14)  編輯  收藏 所屬分類: extremeComponents

          評論

          # re: eXtremeComponents導出時的中文文件名問題 2006-04-08 21:07 江南白衣

          期望能盡快將此特性改進核心版本里,springside就可以去掉對et的擴展了:)  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-04-09 14:58 xplucky

          我也想在eXtremeComponents正式發布之前將此特性納入核心版本,所以希望大家能幫助測試一下,看看會不會有別的暫時還沒有想到的問題。  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-04-11 12:43 Ivan Chen

          這里有必要搞一個自己的toUtf8方法嗎?直接用URLEncoder.encode也可以啊。  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-04-11 12:53 xplucky

          @Ivan Chen
          呵呵,如果你能給我一個示例的話那會更好。
            回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-11-08 16:30 dodo

          請問如何用eXtremeComponents實現點擊表頭,按中文拼音排序的功能?  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-11-09 11:46 yaolin

          我只是把ExportFilterUtils中的

          exportFileName = context.getParameter(exportFileNameStr);

          改成:

          try {
          exportFileName = URLEncoder.encode(context
          .getParameter(exportFileNameStr), DEFAULT_ENCODING);
          } catch (UnsupportedEncodingException e) {
          exportFileName = context.getParameter(exportFileNameStr);
          logger.error(e);
          }

          就好用了。  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-11-09 12:09 yaolin

          哦,補充一句,那個DEFAULT_ENCODING實在開頭定義的:

          private static final String DEFAULT_ENCODING = "UTF-8";  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-11-23 17:40

          我測試不行嗎,“業務室名稱”文件名變成CA4H2V41  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2006-11-23 17:53

          兩位,怎么偶試都不行呢

            回復  更多評論   

          # 無法導出xls文件 2007-06-01 15:42 sweetleaf

          我在appfuse中,試著使用eXtremeComponents的標簽庫,test.jsp頁面能正常顯示,但是加入<ec:exportXls
          fileName="dd.xls"
          tooltip="Export Excel"
          text="XLS"
          />后,點擊導出xls的圖標,頁面跳轉到一個空頁面,名稱也為test.jsp,無任何內容顯示,請問,這是怎么回事?
            回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2007-06-29 18:44 peterwillcn

          @sweetleaf
          需要在web.xml文件中加入eXtremeComponents的導出過濾器的配置,內容如下:

          <filter> <filter-name>eXtremeExport</filter-name> <filter-class>org.extremecomponents.table.filter.ExportFilter</filter-class> <init-param> <param-name>responseHeadersSetBeforeDoFilter</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>eXtremeExport</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
          這樣篩選功能就變成亂碼了  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2009-01-06 17:30 Ivan Chen(西濱)

          toUtf8在ie7下出錯。  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2009-05-13 20:01 jti

          導出excel時,數據列長度過長,導致顯示為 科學技術法,請問如何解決這種問題?  回復  更多評論   

          # re: eXtremeComponents導出時的中文文件名問題 2009-05-14 00:05 Lucky

          這個項目已經快3年沒有維護了,建議你看看GT-grid http://ecside.group.javaeye.com/  回復  更多評論   

          <2006年4月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          隨筆分類(125)

          文章分類(5)

          日本語

          搜索

          積分與排名

          最新隨筆

          最新評論

          主站蜘蛛池模板: 武义县| 明溪县| 城步| 德钦县| 敖汉旗| 木兰县| 定陶县| 巫山县| 威信县| 夏邑县| 襄樊市| 九龙县| 定陶县| 斗六市| 潜江市| 福贡县| 文成县| 宽城| 汤阴县| 朝阳区| 边坝县| 景宁| 延寿县| 兖州市| 沾益县| 南木林县| 东辽县| 清流县| 内江市| 沙洋县| 九龙坡区| 壶关县| 黑山县| 东城区| 临泽县| 红原县| 沐川县| 鄂州市| 普陀区| 吉隆县| 普兰县|