Neste endpoint eu costumo receber arquivos .csv e o que eu faço é acessar o conteúdo e processar cada linha validando as informações para escrever um novo arquivo com o nome correto e jogar em um diretório onde o Apache Camel está mapeado com uma rota.
O problema é que um dos usuários gerou um arquivo .csv, mas abriu em um editor de texto qualquer e salvou por acaso com o encoding UTF-16 LE quando fui processar o arquivo haviam diversos caracteres especiais e tive problemas com o arquivo.
Gostaria de saber se há como sempre que receber um MultipartFile eu conseguiria trocar o charset dele antes de processar o arquivo?
Cara eu cheguei a ver tópicos como esse, nestes exemplos você “sabe” qual é o encoding que está vindo, por exemplo, UTF-16LE e você converte ele para o que você precisa.
Eu queria saber se há algo mais com a possibilidade de receber qualquer encoding e forçar para o encode que eu quero.
Usando o exemplo na thread que você passou eu teria que deixar fixo: “UTF-16LE”.
Você saberia me dizer se há alguma possibilidade de ter algo genérico neste sentido? Eu já procurei bastante e até o momento não encontrei.
Para outros que possam vir a ter a mesma necessidade que eu, consegui resolver semana passada.
Basicamente unindo as threads que vocês me enviaram @darlan_machado e @jacoboliveira
Para converter o arquivo no encode que eu quero basicamente eu criei este método:
private static void encodeFileInLatinAlphabet(InputStream source, String fromEncoding, File target) throws IOException {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(source, fromEncoding));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target),
StandardCharsets.ISO_8859_1))) {
char[] buffer = new char[16384];
int read;
while ((read = reader.read(buffer)) != -1)
writer.write(buffer, 0, read);
}
}
No meu caso eu sempre preciso que o arquivo fique em ISO_8859_1, então ele está fixo dentro do método, mas eu poderia também converter para qualquer encode.
E o outro problema era que no meu caso eu posso receber charsets diferentes, pois é um upload de arquivos que vários usuários utilizam, então eu precisava detectar qual é o charset que veio.
Estou usando essa dependência que trata a maior parte dos charsets (pelo menos os básicos que trabalhamos por aqui), caso ele não encontre eu devolvo uma exceção.
Dessa forma eu consigo pegar o charset do arquivo original e converter para o charset que eu preciso independente do arquivo.