eXtremeComponents的中文的問(wèn)題,目前知道的就是導(dǎo)出使用中文文件名的亂碼問(wèn)題,eXtremeComponents已經(jīng)默認(rèn)使用UTF來(lái)導(dǎo)出XLS,也已經(jīng)給出了PDF導(dǎo)出的解決方案:
最新eXtremeComponents包:支持 PDF中文導(dǎo)出
網(wǎng)友seno指出可以參照SpringSide的解決方案,對(duì)文件名進(jìn)行toUtf8編碼。不過(guò),在我自己實(shí)際應(yīng)用中,我的一個(gè)應(yīng)用根本不需要進(jìn)行任何形式的修正就能正確地生成正確的文件名輸出,如果我在eXtremeComponents添加了toUtf8導(dǎo)出的文件名反而亂碼。所以現(xiàn)在的問(wèn)題是我什么時(shí)候需要對(duì)文件名進(jìn)行toUtf8編碼?這是這段時(shí)間一直困擾我的問(wèn)題,在網(wǎng)友冷月宮主和MagicYang的幫助,昨天經(jīng)過(guò)一整天的查找測(cè)試找到了一個(gè)暫時(shí)看來(lái)令我比較滿意的解決方案(暫時(shí)沒(méi)有CheckIn): 我對(duì)得到的文件名字符串使用jchardet(http://jchardet.sourceforge.net/)進(jìn)行編碼檢測(cè),如果檢測(cè)編碼是ASCII碼則直接返回原字符串,否則的話是用SpringSide提供的toUtf8方法(比我原來(lái)的簡(jiǎn)潔有效)對(duì)字符串進(jìn)行編碼后再返回新的字符串。對(duì)應(yīng)的代碼如下:
/*
* 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);
}
}
經(jīng)過(guò)我們?nèi)齻€(gè)人測(cè)試是成功的。歡迎大家?guī)椭鷾y(cè)試。大家如果有任何意見(jiàn)、建議可與我聯(lián)系: xplucky@gmail.com
壓縮文件只包含: eXtremeComponents.jar eXtremeComponents.tld 和 jchardet.jar
eXtremeComponents.rar