2014-05-21 11 views
9

ZipOutputStream으로 Windows (7)에 파일을 압축하려고합니다. 문제는 파일 이름과 파일 파일 내용에도 그리스 문자 ("ГП0000660040140521_a.txt", 감마와 파이)가 포함되어 있다는 것입니다. 코드는 내가 사용하는 파일 압축하기 :그리스 문자가있는 파일을 압축하는 동안 "IllegalArgumentException : UNMAPPABLE [1]"

ZipOutputStream zipOs = new ZipOutputStream(
    new FileOutputStream("c:\\temp\\test.zip"), Charset.forName("cp737") 
); 

File sourceFile = new File("C:/Path/To/File/ГП0000660040140521_b.txt"); 
String entryName = sourceFile.getName().replaceAll("\\\\", "/"); 
ZipEntry entry = new ZipEntry(entryName); 
zipOs.putNextEntry(entry); 
... 
... 

을하지만 마지막 줄합니다 (putNextEntry 호출)에 내가 얻을 IllegalArgumentException : 나는 문자 매핑 사이에 뭔가 잘못이 있어야 가정

java.lang.IllegalArgumentException: UNMAPPABLE[1] 
at java.util.zip.ZipCoder.getBytes(ZipCoder.java:95) 
at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:407) 
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:221) 

그리스어 및 UTF-8 ... 이름이 파일에 그리스 문자가있는 파일을 압축하는 올바른 방법은 무엇입니까? 편집

나는 문자가 zip 파일을 만들 수 있습니다 설정할 수 있지만 압축 파일의 이름이 잘못로 "UTF-8"사용하는 경우

"ðôðƒ0000660040140521_a.txt"(그리스 문자가 누락)

+0

createZipEntry 메소드는 어떤 기능을합니까? – agad

+0

@agad : 내 실수! 코드를 수정했습니다. 감사. – Steffen

+0

이름이 "잘못"이라고하면 정확히 이것을 확인하고 있습니까? ZIP 파일을 검사 할 때 사용하는 도구는 무엇입니까? 도구를 만들 때 사용한 것과 같은 인코딩을 사용하여 파일 이름을 해석하고 있습니까? –

답변

0

내 질문의 "된장"과 "kriegax"의 의견 때문에이 (늦은) 답변을 작성했습니다.

내가 기억한다면 나는 zip 파일의 파일 이름에 대한 UTF8 지원이 zip 파일의 큰 약점 중 하나라는 것을 알았습니다. (UTF-8은 zip 표준에 의해 지원되는 공식이 아니기 때문에!?). 파일 이름에 UTF-8을 지원하는 기존의 zip 응용 프로그램이 될 수도 있습니다.

그러나. 우리의 경우 그리스어 문자를 "normal"문자 ("a ... z")로 대체하는 것이 좋았습니다. 왜냐하면 파일을 재정렬 프린터에서 생성했기 때문에 모든 경우에 하나의 그리스 문자 만 포함 되었기 때문입니다 : "PI"(유일한 해결 방법 ...).

+0

ZIP의 실제 문제는 파일 이름을 인코딩하는 데 사용 된 실제 인코딩 (charset)에 대한 메타 정보를 전달하지 않는다는 것입니다. – miso

0

가 문자를 매핑 할 수 없을 때마다 항상 예외를 발생하도록 구성된 매퍼를 사용하여, 나는 ZipEntry entry = new ZipEntry(entryName)를 호출하여 바로 다음 자신에 의해 처음으로 설정하고 지정된 문자에 entryName 변환 끝났다.

new String(input.getBytes(charset), charset) 

이 모든 unmpabble 문자가 대체 문자로 변환하고, 예외가 제공되지 않는 것을 보장 : 당신은 예를 들어 이런 식으로 그것을 할 수 있습니다.

시도해보십시오. 원본 입력에서 일부 유니 코드 제어 문자 (매핑 할 수 없음)가 표시됩니다.