Выдача специальных символов CSV для кодировки не UTF 8 - PullRequest
0 голосов
/ 30 мая 2018

Привет, я использую приложение Spring mvc для обработки файлов Excel и CSV.Я столкнулся с одной проблемой, заключающейся в том, что для специальных символов, таких как Dééêàâââ, однажды обрабатывая, он конвертирует их в D�������, что неправильно.Однако, когда кодировка файла CSV - UTF8, специальные символы успешно преобразуются.

Часть вызова ajax показана ниже:

$('#fileuploading').fileupload({

url: 'uploadFile',
dataType: 'json',
acceptFileTypes: /(\.|\/)(csv|xlsx)$/i,
maxFileSize: 10000000,
autoUpload: false,
 disableImageLoad: true,
disableAudioPreview: true,
disableVideoPreview: true,
disableValidation: false,
disableImageResize: true

})

Мой метод контроллераниже показано:

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    public @ResponseBody List<JSONResult> uploadFileHandler(
            @RequestParam("files") MultipartFile file, HttpServletRequest request) {
        logger.info("Starting upload of file: " + file.getOriginalFilename());
        JSONResult result = null;

            try {
                result = uploadFile(file, appUserDTO, result, request);
            } catch (IllegalStateException | IOException e) {
                logger.error(e.getMessage() + e.getStackTrace());
                errorLogService.saveErrorLog("FileUploadController: uploadFileHandler. Error: "+ e.getMessage(), appUserDTO.getUser().getUsrUid());
            }


        List<JSONResult> array = new ArrayList<>();
        array.add(result);
        return array;
    }

Пожалуйста, найдите ниже метод обработки файла

    public CsvFileReader(String path, String delimeter, File file) throws FileNotFoundException {
    String line="";
    rows = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF8"))) {            
        while ((line = br.readLine()) != null) {

            String[] lineData = line.split(delimeter,-1);
            if(SanityCheck.isValid(lineData)){
                rows.add(lineData);
            }               
        }
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

Кто-нибудь может указать мне правильное направление, как решить эту проблему, пожалуйста?

1 Ответ

0 голосов
/ 30 мая 2018

Ваша программа пытается прочитать файлы в UTF-8, поэтому файлы должны быть в UTF-8, и они не будут работать, если они не работают.

Если вы спрашиваете, какобрабатывать файлы, которые могут быть в любой кодировке, кодировка файла не может быть угадана, поэтому вам нужно сообщить серверу о кодировке файла при загрузке, используя дополнительную информацию, такую ​​как поле формы, указывающее кодировку.

Если вы спрашиваете, как обрабатывать файлы, которые могут быть в любой кодировке, тогда как вы не знаете, как получить их из кодировки файла, потому что файлы просто хранятся там, и вы не знаете о каком-либо листингео кодировке каждого из них, как я уже сказал, об этом нельзя догадаться.

Если вам так хочется, вы можете попытаться угадать кодировку файла, сначала прочитав его в UTF-8,и проверка, содержит ли результат недопустимые символы.Если нет, то чтение в UTF-8, скорее всего, было правильным.Если есть недопустимые символы, вероятно, UTF-8 не была правильной кодировкой, и вы должны попробовать другую.Эта другая кодировка может быть Windows-1252 ... И это может быть что-то совсем другое.Не знаю, правда.

...