使用Java CsvReader读取CSV时德语变音字符(Umlaute)乱码求助
解决CsvReader读取德语特殊字符(Umlaute)乱码问题
可行的解决步骤:
确认CSV文件的实际编码
乱码最常见的原因是文件本身并非UTF-8编码,德语文件常使用ISO-8859-1(Latin-1)或Windows-1252编码。你可以用Notepad++等工具打开文件,查看状态栏显示的编码类型。
如果文件是ISO-8859-1,修改字符集参数:CsvReader addressDataCsvFile = new CsvReader(addressDataCsvFilename, ',', Charset.forName("ISO-8859-1"));如果是
Windows-1252,则替换为:CsvReader addressDataCsvFile = new CsvReader(addressDataCsvFilename, ',', Charset.forName("Windows-1252"));改用InputStreamReader包装文件流
部分旧版本的CsvReader构造方法对字符集的处理可能存在问题,尝试通过InputStreamReader明确指定编码:try (InputStreamReader reader = new InputStreamReader( new FileInputStream("Tannis_Export.csv"), Charset.forName("ISO-8859-1") // 替换为文件实际编码 )) { CsvReader addressDataCsvFile = new CsvReader(reader, ','); addressDataCsvFile.readHeaders(); while (addressDataCsvFile.readRecord()) { String strassenName = addressDataCsvFile.get("Strasse"); // 后续业务逻辑 } } catch (IOException e) { e.printStackTrace(); }排查输出/显示环节的编码问题
有时候读取逻辑是正确的,但输出到控制台或写入文件时出现编码错误:- 若控制台输出乱码,设置控制台编码为UTF-8:
System.setOut(new PrintStream(System.out, true, "UTF-8")); - 若写入文件,确保写入时使用UTF-8编码:
try (PrintWriter writer = new PrintWriter("output.txt", "UTF-8")) { writer.println(strassenName); }
- 若控制台输出乱码,设置控制台编码为UTF-8:
用编码检测工具确认文件编码
可以借助juniversalchardet库自动检测文件编码,避免手动猜测:File csvFile = new File("Tannis_Export.csv"); CharsetDetector detector = new CharsetDetector(); detector.setText(new FileInputStream(csvFile)); CharsetMatch match = detector.detect(); if (match != null) { String fileCharset = match.getName(); System.out.println("检测到文件编码: " + fileCharset); // 使用该编码初始化CsvReader CsvReader addressDataCsvFile = new CsvReader(csvFile.getAbsolutePath(), ',', Charset.forName(fileCharset)); }
内容的提问来源于stack exchange,提问作者Robert Bethge
相关产品推荐
相关产品推荐

