2012-04-20 5 views
9

У меня есть listgrid, в котором все элементы отображаются правильно с диакритикой, так как они находятся в db как локально, так и на сервере jboss.Экспорт в проблемы с кодированием CSV

Однако, на сервере jboss, когда я пытаюсь экспортировать как csv, все символы диакритики заменяются, поэтому я получаю что-то вроде ÃÂ~coala вместо Şcoala, хотя диакритики отображаются правильно в списке.

Локально прекрасно работает как в списке, так и в экспорте.

Вот мой код для экспорта:

private void Export() { 
    String exportAs = (String) m_ExportForm.getField("exportType").getValue(); 
    FormItem item = m_ExportForm.getField("showInWindow"); 
    boolean showInWindow = item.getValue() == null ? false : (Boolean) item.getValue(); 

    // exportAs is either XML or CSV, which we can do with requestProperties 
    Map<String,String> params= new java.util.HashMap<String, String>(); 
    params.put("Accept-Charset","utf-8"); 

    DSRequest dsRequestProperties = new DSRequest(); 
    dsRequestProperties.setHttpHeaders(params); 
    dsRequestProperties.setExportValueFields(true); 
    dsRequestProperties.setExportAs((ExportFormat)EnumUtil.getEnum(ExportFormat.values(), exportAs)); 
    dsRequestProperties.setExportDisplay(showInWindow ? ExportDisplay.WINDOW : ExportDisplay.DOWNLOAD); 

    // TODO: move in user-config 
    dsRequestProperties.setExportTitleSeparatorChar("_"); 
    dsRequestProperties.setExportDelimiter(";"); 

    dsRequestProperties.setExportFilename("export." + extensionsValueMap.get(exportAs)); 
    dsRequestProperties.setContentType("text/csv; charset=UTF-8"); 
    m_Target.Export(dsRequestProperties); 

    Close(); 
} 

Кроме того, в моем файле свойств JBoss 7 У меня есть это:

<system-properties> 
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/> 
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/> 
</system-properties> 

, который работает как listgrids показывают диакритические правильно.

Кроме того, в моем web.xml у меня есть мой сервлет

<init-param> 
    <param-name>encoding</param-name> 
    <param-value>UTF-8</param-value> 
</init-param> 

Может быть, я на неправильном пути, и это вызвано чем-то другим.

И файл, экспортированный локально, и файл, экспортированный с сервера jboss, имеет точный размер файла.

Кроме того, для моей JBoss я JVM установить свойство для JAVA_OPTS

-Dfile.encoding=UTF-8 

EDIT: добавил карту Params в связи с предложением. Еще ничего.

+0

Возможно, это может дать вам некоторое понимание? https://community.jboss.org/message/646601 – Phani

+0

Захватите заголовки запроса и ответа HTTP и опубликуйте их. Кроме того, размещайте размеры файлов в байтах CSV, которые вы загружаете, и которые имеют «?». –

ответ

2

Похоже, что это проблема кодирования/декодирования символов.

Ваш код сгенерировал CSV-файл в кодировке UTF-8. Однако, какую программу вы используете для , прочитайте CSV? Windows блокнот? Если это приложение Windows, скорее всего, предполагается, что текстовый файл находится в кодировке ISO-8859-1.

Вариант 1:

Телль блокнот или приложение Windows, кодировка. С помощью блокнота в диалоговом окне «Файл/Открыть» есть раскрывающийся список. Переключитесь на UTF-8.

Вариант 2:

Изменение кодировки в исходном коде от UTF-8 к ISO-8859-1, который соответствует кодировке по умолчанию Windows'. Изменение строки:

dsRequestProperties.setContentType("application/csv; charset=UTF-8"); 

в

dsRequestProperties.setContentType("application/csv; charset=ISO-8859-1"); 

, мы надеемся, сделать трюк. Параметр org.apache.catalina.connector.URI_ENCODING не влияет на кодировку файла и должен быть оставлен как есть.

+0

Проблема локально, где у меня есть jvm-кодировка utf-8, если я загружаю файл, я получаю файл с диакритикой, который в порядке. Если я сделаю то же самое на моем сервере jboss, файл будет сохранен без диакритики. Это не вопрос чтения файла. – Fofole

+0

@Fofole, какой набор символов сервер JBoss объявляет для загруженного файла? 'Content-type: text/plain; кодировка = UTF-8'? Это то же самое на вашей локальной машине dev и на сервере JBoss? Что показывает скрипач/netmon или WireShark? – Ben

1

Должен признаться, в этом созвездии я не видел charset=.... Но кодировка имеет больше смысла для текста, так что попробуйте первый:

dsRequestProperties.setContentType("text/csv; charset=UTF-8"); 

Причина, application которая вполне могла бы указать двоичные данные, могла бы сделать кодирование кодировка байт опасно.


Добавлено: мое объяснение ошибки

Может быть строка asExport получил UTF-8, но дает для многобайтного полукокса вместо двух символов. Они также находятся в диапазоне, отличном от ASCII, и ваш ответ каким-то образом хочет доставить ISO-8859-1 (по умолчанию latin-1) и пишет ??. Это 2 ошибки.

Вы можете осмотреть asExport. Зачем писать в UTF-8 не удается, несмотря на charset = UTF-8 ...

+0

Изменено, и результат тот же :( – Fofole

+0

Вы выполнили глобальные настройки, но у сервлета также есть параметр init-param для кодировки: http://www.smartclient.com/smartgwtee/server/javadoc/index.html?com /isomorphic/servlet/IDACall.html. Не могу себе представить, что вы этого не увидели. Может быть, 'exportAs' уже ошибочен, добавлен в мой ответ –

1

У вас, вероятно, есть несколько фильтров FilterServlets в вашей настройке JBoss, которые мешают кодировке. Возможно, связано с аутентификацией или сжатием.

Смежные вопросы