You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:07:05