java - 非 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());
}
}
任何人都可以指出我正确的方向如何解决这个问题?
解决方案
您的程序尝试读取 UTF-8 格式的文件,因此这些文件需要采用 UTF-8 格式,如果不是,它将无法工作。
如果您要询问如何处理可以采用任何编码的文件,则无法猜测文件的编码,因此您需要在上传文件时通知服务器文件的编码,使用额外的信息,例如指示的表单字段编码。
如果您询问如何处理可以采用任何编码的文件,而您不知道如何从文件的编码中获取,因为这些文件只是隐藏在那里并且您不知道任何列表他们每个人的编码,就像我说的那样,它无法猜测。
如果您愿意,可以尝试猜测文件的编码,方法是先以 UTF-8 读取文件,然后检查结果是否包含无效字符。如果不是,那么用 UTF-8 读取它很可能是正确的。如果有无效字符,那么很可能 UTF-8 不是正确的编码,您应该尝试另一个。其他编码可能是 windows-1252 ......它可能完全是另外一回事。没办法知道,真的。
推荐阅读
- elasticsearch - Elasticsearch 多个搜索词
- javascript - 保存或编辑数据后重定向?
- windows - Neo.ClientError.Procedure.ProcedureNotFound Neo4j Windows 桌面版
- javascript - 使用 jquery 用一个月的总天数填充表数据
- delphi - delphi:组合框搜索文本与项目文本大小写相同
- python - 如何编写一个接收整数的函数 function(n),并使用 while 循环返回前 n 个偶数的总和?
- laravel - 无法在 laravel 6.9.0 共享主机部署中创建符号链接
- django - 容器以分离模式运行时未执行初始化脚本
- c - 函数第一次调用时正确分配内存,但第二次没有
- spring-boot - 谁调用 configureGlobal 函数?如何调用configureGlobal函数?