Spring Boot读取ISO-8859-1格式CSV时土耳其字符乱码问题
土耳其字符CSV文件读取乱码问题
我在Spring Boot应用中读取并处理ISO-8859-1格式、包含土耳其字符的CSV文件时遇到乱码问题:用BufferedReader读取时内容看似正常,但日志输出或传输到其他服务时土耳其字符就会乱码。
示例:
- 原内容:
EDIRNE;IPSALA;ATATÜRK;28.04.2025;16:28:00;İİÇŞÜĞİİİ - 乱码后:
EDÝRNE;IPSALA;ATATÜRK;28.04.2025;16:28:00;ÝÇÞÜÐÝÝÝ
现有代码
CSV读取代码
public List<String> read(InputStream inputStream) { logger.info("csv read started"); List<String> csvFileContent = new ArrayList<>(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { csvFileContent.add(line); } reader.close(); } catch (IOException e) { //Handle exception } logger.info("csv read finished"); logger.info(csvFileContent.toString()); return csvFileContent; }
CSV解析代码
private CSVParser parseCsvContent(List<String> sftpContent) throws IOException { return CSVParser.parse(String.join("\n", sftpContent), CSVFormat.DEFAULT.builder() .setHeader() .setDelimiter(';') .build()); }
SFTP文件读取代码
public List<String> readFromSFTP(String ftpAddress, Integer ftpPort, String ftpUserName, String ftpPassword, String ftpDirectory) { logger.info("readFromSFTP started"); try { Session session = sftpSessionFactory.createSession(ftpUserName, ftpAddress, ftpPort, ftpPassword); ChannelSftp channel = sftpChannelService.createAndConnectChannel(session); logger.info("channel: "+channel.isConnected()); String targetFileName = getValidFileNames(channel, ftpDirectory); logger.info("/readFromSFTP/targetedFileName: "+targetFileName); channel.cd(ftpDirectory); if (targetFileName != null) { InputStream inputStream = channel.get(targetFileName); sftpFileContent = fileReadingService.readFromStream(inputStream, targetFileName); } else { setValidFileName(null); logger.warn("There are no valid CSV files available for processing."); } channel.disconnect(); session.disconnect(); } catch (JSchException | SftpException e) { throw new SftpFileAccessException("Error while accessing or processing SFTP files."+ e.getMessage(),e); } catch (Exception e) { e.printStackTrace(); } logger.info("readFromSFTP finished"); return sftpFileContent; }
已尝试的编码方案
在read方法中试过以下编码方式,均未解决乱码:
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "ISO-8859-1"));BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "ISO-8859-9"));
唯一特殊情况:用windows-1254编码读取时,调试时csvFileContent里能看到正确的土耳其字符,但日志输出或传输到服务时依然乱码:
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "windows-1254"));
内容的提问来源于stack exchange,提问作者Mustafa
相关产品推荐
相关产品推荐

