부모 대상 디렉토리의 여러 xlsx 파일에 데이터를 쓰는 독립 실행 형 Java 프로세스를 실행 중입니다. 완료되면 전체 대상 디렉토리가 압축되어 클라우드에 업로드되고 다운로드 링크가 사용자에게 제공됩니다. . xlsx 파일 이름과 zip 파일의 이름은 사용자 정의이며 변경할 수 없습니다.Java - 일본어 파일 이름이 깨져 있음
문제는 생성 된 xlsx 파일의 이름입니다. 사용자에 의해 선택된 파일 이름
같이, 일본어이면 サ イ ン 色 紙 プ レ ゼ ン ト CPN_ 第 2.xlsx
시스템에서 생성 된 해당 파일의 형식이다
?????????? CPN_? 2? .XLSX
같은 파일이 클라우드에 업로드되고 있으며, 사용자가 잘못된 파일 이름을보고있다. 그러나 zip 파일의 일본어 이름이 왜곡되지 않고 일본어로만 제공됩니다.
코드 XLSX 파일을 생성하기위한 샘플을 다음과 같은 :이 경우
String fileName = userGivenName + "_" + randomUUID + ".xlsx";
File file = new File(tmpParentDirectoryName, fileName);
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
만든 XLSX 파일의 절대 경로와 같다 :
/tmpDirectoryPath/?????? ???? CPN_? 2? 위와 같은 tmpDirector에서 만든 여러 XLSX 파일이있는 것처럼
_0c6b37ee-97c4-44d4-b80d-dfe5eafe0045.xlsx
public static void createZipFile(File[] files, File zipFile) {
if (ArrayUtils.isEmpty(files)) {
return;
}
byte[] buffer = new byte[1024];
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
try {
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
try {
String fileName = URLDecoder.decode(file.getName(), "UTF-8");
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
} finally {
IOUtils.closeQuietly(fis);
}
}
} finally {
IOUtils.closeQuietly(zos);
}
}
업로드 된 zip 파일 : 코드의 조각에 따라
File[] files = getFilesInFolder(tmpDirectory);
if (ArrayUtils.isEmpty(files)) {
continue;
}
File zipFile = new File(targetDirectory, compressedFileName);
createZipFile(files, zipFile);
String url = uploadFile(compressedFileName, zipFile);
이 zip 파일에 데이터를 기록 : 다음 완료되면 y를
은 zip 파일을 생성하고 클라우드에 업로드하는 코드 샘플입니다 올바른 일본어 이름을 가지고 있지만 zip 파일의 zip 항목이 xlsx 파일 이름을 왜곡시킵니다.
이locale
LANG=en_IN.UTF-8
LC_CTYPE="en_IN.UTF-8"
LC_NUMERIC="en_IN.UTF-8"
LC_TIME="en_IN.UTF-8"
LC_COLLATE="en_IN.UTF-8"
LC_MONETARY="en_IN.UTF-8"
LC_MESSAGES="en_IN.UTF-8"
LC_PAPER="en_IN.UTF-8"
LC_NAME="en_IN.UTF-8"
LC_ADDRESS="en_IN.UTF-8"
LC_TELEPHONE="en_IN.UTF-8"
LC_MEASUREMENT="en_IN.UTF-8"
LC_IDENTIFICATION="en_IN.UTF-8"
LC_ALL=
누군가가 내가 잘못 여기서 뭐하는 오전 나를 안내 할 수 있습니다 :
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
은 locale 명령의 출력은 다음과 같습니다
독립 자바 프로세스는 인코딩 옵션을 다음있다? 사용자가 지정한 것과 동일한 파일 이름을 업로드하고 싶습니다.
사용자 입력을 확인 했습니까? 일본어 파일 이름이 UTF-8로 인코딩 되었습니까? Shift-JIS와 같은 다른 인코딩으로 인코딩 된 경우 UTF-8로 저장하면 쉽게 garbles가됩니다. – akky