MS Excel отображает искаженные символы азербайджанского текста в файле CSV, экспортированном в кодировке UTF-8.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 MS Excel отображает искаженные символы азербайджанского текста в файле CSV, экспортированном в кодировке UTF-8.

Сообщение Anonymous »

Я создаю файл CSV с азербайджанским текстом, используя кодировку Java и UTF-8 с BOM. Файл открывается правильно в WPS Office, но при открытии в MS Excel азербайджанские символы отображаются в виде искаженных символов.
Ожидаемый текст: Riskli vergi ödəyicilərinin axtarışı

Что отображается в Excel: Riskli vergi ödÉ™yicilÉ™rinin axtarışı
Мой код:
public void writeCsvForInformationalServiceDetailed(
List items,
LocalDateTime periodStart,
LocalDateTime periodEnd,
HttpServletResponse response) {

response.setContentType("text/csv; charset=UTF-8");

response.setHeader(
"Content-Disposition",
"attachment; filename=informational_service_detailed.csv"
);

try (ServletOutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(writer)) {

bw.write('\ufeff');

bw.write("Hesabatın əhatə etdiyi tarix aralığı,");
bw.write(periodStart.format(DATE_TIME_FORMATTER)
+ " - "
+ periodEnd.format(DATE_TIME_FORMATTER));
bw.newLine();

bw.write("Cəmi,");
bw.write(String.valueOf(items.size()));
bw.newLine();
bw.newLine();

bw.write(String.join(",",
"Əməliyyat İD",
"E-xidmətin adı",
"IP",
"Start Date",
"Start Time",
"End Date",
"End Time",
"Status",
"Error Created At",
"Error Message",
"Level",
"Comment"
));
bw.newLine();

for (InformationalServiceDetailedExcelItem item : items) {
bw.write(String.join(",",
csv(item.getServiceUsageId()),
csv(getSafeValue(item.getService().getName(), Language::getAz)),
csv(item.getIp()),
csv(formatDate(item.getServiceStartedAt(), DATE_FORMATTER)),
csv(formatDate(item.getServiceStartedAt(), TIME_FORMATTER)),
csv(formatDate(item.getServiceEndedAt(), DATE_FORMATTER)),
csv(formatDate(item.getServiceEndedAt(), TIME_FORMATTER)),
csv(item.getStatus() != null ? item.getStatus().getValueAz() : ""),
csv(formatDate(item.getErrorCreatedAt(), DATE_TIME_FORMATTER)),
csv(getSafeValue(item.getError(), e -> e.getMessage().getAz())),
csv(getSafeValue(item.getLevel(), LevelType::getDescriptionByValue)),
csv(item.getComment())
));
bw.newLine();
}

bw.flush();

} catch (Exception e) {
log.error("ActionLog.writeCsvForInformationalServiceDetailed.failed: RID={}",
new HttpUtil().getCurrentRequestId(), e);
throw new FileGenerateException();
}
}

private String csv(Object value) {
if (value == null) return "";
String s = value.toString().replace("\"", "\"\"");
if (s.contains(",") || s.contains("\"") || s.contains("\n") || s.contains("\r")) {
return "\"" + s + "\"";
}
return s;
}

Что я пробовал:
  • ✅ UTF-8 с спецификацией (\ufeff)
  • ✅ Добавлена строка sep=,
  • ✅ Пробовала кодировку Windows-1254
  • ✅ Правильное экранирование CSV
Среда: 7
  • Java 1
  • Spring Boot
  • MS Excel 2016/2019 (отображает искаженный текст)
  • WPS Office (работает правильно)
Вопрос: Как я могу экспортировать CSV-файл, который правильно отображает азербайджанские символы (или другие символы Юникода) при открытии в MS Excel? Есть ли способ заставить Excel правильно распознавать кодировку UTF-8 или мне следует переключиться на другой формат, например XLSX?


Подробнее здесь: https://stackoverflow.com/questions/798 ... exported-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»