2012-04-20 22 views
9

Tengo una lista en la que todos los elementos se muestran correctamente con diacríticos, ya que están en db tanto localmente como en el servidor jboss.Exportación a problemas de codificación CSV

Sin embargo, en el servidor jboss, cuando intento exportar como csv, todos los caracteres diacríticos son reemplazados, así que obtengo algo como Ãcocala en lugar de Şcoala, aunque los signos diacríticos se muestran correctamente en la lista de grillas.

Localmente funciona bien tanto mostrando en listgrid como exportando.

Aquí está mi código para la exportación:

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(); 
} 

Además, en mi archivo de propiedades JBoss 7 tengo esto:

<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> 

que funciona como los listgrids muestran signos diacríticos correctamente.

Además, en mi web.xml tengo para mi servlet

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

tal vez estoy en un camino equivocado y esto es causado por algo más.

Tanto el archivo exportado localmente como el archivo exportado desde el servidor jboss tienen el tamaño de archivo exacto.

Además, para mi JVM Jboss que establece la propiedad de JAVA_OPTS

-Dfile.encoding=UTF-8 

EDIT: añade el mapa params debido a la sugestión. Aún nada.

+0

¿Puede ser que esto pueda darle una idea? https://community.jboss.org/message/646601 – Phani

+0

Capture los encabezados de solicitud y respuesta HTTP y publíquelos. Además, publique los tamaños de archivo en bytes del CSV que descarga ese trabajo y el que tiene '??'. –

Respuesta

2

Parece que es un problema de codificación/decodificación de caracteres.

Su código generó un archivo CSV en la codificación UTF-8. Sin embargo, ¿qué programa está usando para leer el CSV? Bloc de notas de Windows? Si se trata de una aplicación de Windows, es probable que asuma que el archivo de texto está codificado en ISO-8859-1.

Opción 1:

libreta Tell o su aplicación de Windows la codificación. Con el bloc de notas, hay un menú desplegable de codificación en el cuadro de diálogo Archivo/Abrir. Cambie esto a UTF-8.

Opción 2:

cambiar la codificación en el código fuente UTF-8-ISO-8859-1, que coincide con la codificación predeterminada de Windows'. Cambiando la línea:

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

a

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

con suerte hará el truco. La configuración org.apache.catalina.connector.URI_ENCODING no afecta la codificación del archivo y debe dejarse como está.

+0

El problema es localmente donde tengo la codificación jvm para utf-8 si descargo el archivo, obtengo el archivo con diacríticos, lo cual está bien. Si hago lo mismo en mi servidor jboss, el archivo se guarda sin signos diacríticos. Esto no es una cuestión de leer el archivo. – Fofole

+0

@Fofole, ¿qué juego de caracteres declara el servidor de JBoss para el archivo descargado? 'Content-type: text/plain; charset = UTF-8'? ¿Es lo mismo en su máquina de desarrollo local y en el servidor de JBoss? ¿Qué muestra fiddler/netmon o WireShark? – Ben

1

Debo admitir que en esta constelación no he visto un charset=.... Pero el conjunto de caracteres tiene más sentido para el texto, así que intenta en primer lugar:

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

Razón, application que bien podría indicar datos binarios, haría una codificación de byte juego de caracteres peligroso.


Agregado: mi explicación para el error

Tal vez la cadena asExport tiene UTF-8, pero da para un char de varios bytes en lugar de dos caracteres. Esos también están en el rango no ASCII, y su respuesta de alguna manera quiere entregar ISO-8859-1 (el latin-1 predeterminado) y escribe ??. Eso son 2 errores.

Puede inspeccionar asExport. ¿Por qué escribir en UTF-8 no tiene éxito a pesar de charset = UTF-8 ...

+0

Se modificó y el resultado es el mismo :( – Fofole

+0

Ha realizado la configuración global, pero el servlet también tiene un param para la codificación; http://www.smartclient.com/smartgwtee/server/javadoc/index.html?com /isomorphic/servlet/IDACall.html. No puedo imaginar que no lo veas. Tal vez el 'exportAs' ya sea incorrecto; agregado a mi respuesta –

1

Es probable que tenga algunos FilterServlets adicionales en la configuración de JBoss que están interfiriendo con la codificación. Posiblemente relacionado con la autenticación o compresión.

Cuestiones relacionadas