1

부모 대상 디렉토리의 여러 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 명령의 출력은 다음과 같습니다

독립 자바 프로세스는 인코딩 옵션을 다음있다? 사용자가 지정한 것과 동일한 파일 이름을 업로드하고 싶습니다.

+0

사용자 입력을 확인 했습니까? 일본어 파일 이름이 UTF-8로 인코딩 되었습니까? Shift-JIS와 같은 다른 인코딩으로 인코딩 된 경우 UTF-8로 저장하면 쉽게 garbles가됩니다. – akky

답변

0

나는 이것을 마침내 깨뜨릴 수있었습니다. 자바 프로세스를 실행하고있는 mesos 슬레이브의 시스템 속성에 문제가 있습니다. 슬레이브의 프로세스는 시작 스크립트를 사용하는 mesos 마스터 스케줄러에 의해 시작되었습니다. 이것 때문에, 디폴트의 Java 로케일 프로퍼티가 슬레이브에 올바르게 설정되어 있지 않았습니다.

나는 노예의 시작 스크립트에 다음 라인을 추가 :

export LANG=en_IN.UTF-8 

명시 적으로 시작 스크립트에 로케일 속성을 추가하면이 문제를 해결할 수 있었다.

관련 문제