您好我正在使用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());
}
}
任何人都可以指出我正确的方向如何解决这个问题?
答案 0 :(得分:2)
您的程序尝试读取UTF-8中的文件,因此文件需要使用UTF-8,如果不是,则无法使用。
如果您正在询问如何处理可以采用任何编码的文件,则无法猜测文件的编码,因此您需要在上传文件时通知服务器该文件的编码,使用额外的信息,例如表示编码的表单字段。
如果您正在询问如何处理任何编码中的文件,而您不知道如何从文件的编码中获取文件,因为文件只是藏在那里,而您却不知道任何文件的编码列出每个人的编码,就像我说的那样,不能猜到。
如果您愿意,可以尝试通过首先以UTF-8读取文件并检查结果是否包含无效字符来猜测文件的编码。如果没有,用UTF-8读取它很可能是正确的。如果有无效字符,那么可能UTF-8不是正确的编码,你应该尝试另一种。其他编码可能是windows-1252 ......而且它可能完全不同。真的没办法知道。