非UTF 8编码的CSV特殊字符问题

时间:2018-05-30 04:48:01

标签: java ajax spring-mvc character-encoding

您好我正在使用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 :(得分:2)

您的程序尝试读取UTF-8中的文件,因此文件需要使用UTF-8,如果不是,则无法使用。

如果您正在询问如何处理可以采用任何编码的文件,则无法猜测文件的编码,因此您需要在上传文件时通知服务器该文件的编码,使用额外的信息,例如表示编码的表单字段。

如果您正在询问如何处理任何编码中的文件,而您不知道如何从文件的编码中获取文件,因为文件只是藏在那里,而您却不知道任何文件的编码列出每个人的编码,就像我说的那样,不能猜到。

如果您愿意,可以尝试通过首先以UTF-8读取文件并检查结果是否包含无效字符来猜测文件的编码。如果没有,用UTF-8读取它很可能是正确的。如果有无效字符,那么可能UTF-8不是正确的编码,你应该尝试另一种。其他编码可能是windows-1252 ......而且它可能完全不同。真的没办法知道。