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

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

})

我的 Controller 方法如下所示:

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

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

最佳答案

您的程序尝试读取 UTF-8 格式的文件,因此文件必须采用 UTF-8 格式,否则将无法工作。

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

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

如果您愿意,可以尝试猜测文件的编码,首先以 UTF-8 读取文件,然后检查结果是否包含无效字符。如果不是,则以 UTF-8 格式读取很可能是正确的。如果存在无效字符,则可能 UTF-8 不是正确的编码,您应该尝试其他编码。其他编码可能是 windows-1252...并且它可能完全是其他编码。真的没办法知道。

关于java - 非 UTF 8 编码的 CSV 特殊字符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50596566/

相关文章:

java - REXP as List 不返回输出

java - 使用另一个数据集中的值搜索和更新 Spark 数据集列

java - 即使我在字段中输入一些数据,EditText 字段也被识别为空,因此程序不会继续进行

jquery - 如何从客户端创建和发送 JSON

php - $.post() 回调不起作用,除非在一种情况下

java - 已为此响应调用 HandlerInterceptor getOutputStream()

java - 向 Chrome 同步服务发送 HTTPS 请求 - 收到错误 404

javascript - 在子菜单中找到选中的复选框

json - 如果与 ClientHttpRequestInterceptor 一起使用,Spring Resttemplate postforobject 返回 null 作为对象响应

json - Scala、Json 和 Spring Boot Rest