首页 > 解决方案 > 非 UTF 8 编码的 CSV 特殊字符问题

问题描述

您好我正在使用 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());
    }
}

任何人都可以指出我正确的方向如何解决这个问题?

标签: javaajaxspring-mvccharacter-encoding

解决方案


您的程序尝试读取 UTF-8 格式的文件,因此这些文件需要采用 UTF-8 格式,如果不是,它将无法工作。

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

如果您询问如何处理可以采用任何编码的文件,而您不知道如何从文件的编码中获取,因为这些文件只是隐藏在那里并且您不知道任何列表他们每个人的编码,就像我说的那样,它无法猜测。

如果您愿意,可以尝试猜测文件的编码,方法是先以 UTF-8 读取文件,然后检查结果是否包含无效字符。如果不是,那么用 UTF-8 读取它很可能是正确的。如果有无效字符,那么很可能 UTF-8 不是正确的编码,您应该尝试另一个。其他编码可能是 windows-1252 ......它可能完全是另外一回事。没办法知道,真的。


推荐阅读