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

Java 非UTF 8编码的CSV特殊字符问题,java,ajax,spring-mvc,character-encoding,Java,Ajax,Spring Mvc,Character Encoding,您好,我正在使用SpringMVC应用程序处理excel和csv文件。我遇到了一个问题,对于像Dèèèèèèèèèèèèèè������� 这是错误的。 但是,当csv文件编码为UTF8时,特殊字符将成功转换 ajax调用的一部分如下所示: $('#fileuploading').fileupload({ url: 'uploadFile', dataType: 'json', acceptFileTypes: /(\.|\/)(csv|xlsx)$/i, maxFileSize: 10000

您好,我正在使用SpringMVC应用程序处理excel和csv文件。我遇到了一个问题,对于像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;
    }
})

我的控制器方法如下所示:

$('#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;
    }
@RequestMapping(value=“/uploadFile”,method=RequestMethod.POST)
public@ResponseBody List uploadFileHandler(
@RequestParam(“文件”)多部分文件(HttpServletRequest){
logger.info(“开始上传文件:+file.getOriginalFilename());
JSONResult=null;
试一试{
结果=上传文件(文件、appUserDTO、结果、请求);
}捕获(非法状态例外| IOE例外){
logger.error(e.getMessage()+e.getStackTrace());
errorLogService.saveErrorLog(“FileUploadController:uploadFileHandler.Error:+e.getMessage(),appUserDTO.getUser().getUsrUid());
}
列表数组=新的ArrayList();
数组。添加(结果);
返回数组;
}
请查找以下处理该文件的方法

    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());
    }
}
public CsvFileReader(字符串路径、字符串delimeter、文件文件)抛出FileNotFoundException{
字符串行=”;
行=新的ArrayList();
try(BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path),“UTF8”)){
而((line=br.readLine())!=null){
String[]lineData=line.split(delimeter,-1);
if(SanityCheck.isValid(lineData)){
行。添加(行数据);
}               
}
}捕获(IOE异常){
logger.error(例如getMessage());
}
}

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

您的程序尝试读取UTF-8格式的文件,因此这些文件必须是UTF-8格式的,如果不是,则无法工作

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

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


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

文本文件的字符编码是发送方和接收方之间的协议。一个必须告诉另一个。或者,接受一种不同的易于处理的格式,如.xlsx,就像你看起来那样。