본문 바로가기
리눅스

Unzip 한글 패치 정보와 그놈 File-Roller

by 다움위키 2025. 3. 6.

원문 보기: https://dawoum.duckdns.org/wiki/ZIP_(file_format)/Unzip_hangul_patch

 

인터넷은 너무 넓어서 원하는 정보를 찾기가 힘듭니다. 특히 아주 특수한 상황에 대한 해결책은 일부 사람들에게만 영향을 미치기 때문에 해결책이 전혀 없거나 있어도 현재 상황과 맞지 않을 수 있습니다.

예를 들어, Linux Tip에서 unzip으로 한글이 깨지면, "-0 cp949"를 넣어서 해결할 수 있다고 알려져 있었습니다.

어쨌든, 현재 unzip-6.0 버전에서는 그런 옵션 자체가 없습니다. 문제 자체는 윈도우 운영 시스템에서 zip으로 묶은 파일을 다운로드 받아서 리눅스 시스템에서 풀었을 때, 2025년 3월 기준 대부분 리눅스 시스템이 UTF-8을 사용함으로써 발생하는 것입니다.

이를 해결하기 위해, iconv 명령을 통해 euc-kr을 utf-8로 바꾸고 나서, unzip으로 접근할 수 있습니다. 어쨌든 매번 unzip을 위해 선행 작업을 하는 것이 귀찮기 때문에, unzip 자체에서 문제를 파악해서 iconv를 수행한 후, unzip을 하도록 수정되기를 희망합니다.

한편, unzip-5.xx 버전에서 몇 개의 패치가 존재했었던 것으로 보이고, 그 중에서 동작하는 것이 필요합니다.

Working patch

자주 사용하지는 않지만, 매번 이런 일이 있을 때마다 해결책이 없는지 확인하는 것이 귀찮습니다 (이 문제는 횟수가 기억나지는 않지만, 아마도 여러 번 해결책을 찾으려고 시도했습니다).

다행스럽게도, 현재의 unzip 6.0에서 동작하는 패치가 있습니다.

위 패치가 단독으로 적용했을 때, 문제 없이 패치가 되지만, 다른 데비안 패치와 같이 적용했을 때 적용이 되지 않아서, 새롭게 파일을 갱신했습니다:

diff --color -urN unzip60.orig/fileio.c unzip60/fileio.c
--- unzip60.orig/fileio.c	2009-04-20 09:03:44.000000000 +0900
+++ unzip60/fileio.c	2025-03-06 22:06:45.791670560 +0900
@@ -2238,10 +2238,35 @@
         G.filename[length] = '\0';      /* terminate w/zero:  ASCIIZ */
 #endif /* ?UNICODE_SUPPORT */
 
-        /* translate the Zip entry filename coded in host-dependent "extended
-           ASCII" into the compiler's (system's) internal text code page */
-        Ext_ASCII_TO_Native(G.filename, G.pInfo->hostnum, G.pInfo->hostver,
-                            G.pInfo->HasUxAtt, (option == DS_FN_L));
+        /* translate the Zip entry filename code to set utf-8 */
+#include <iconv.h>
+#include "utf.h"
+
+#define ICONV_BUF_SIZE	260
+		size_t ileft, oleft;
+		iconv_t cd;
+		size_t iconv_result;
+		size_t size;
+		char inbuf[ICONV_BUF_SIZE];
+		char outbuf[ICONV_BUF_SIZE];
+		char *inptr = inbuf;
+		char *outptr = outbuf;
+		
+		size = strlen(G.filename)+1;
+		strncpy(inbuf, G.filename, size);
+		ileft = size;
+		oleft = sizeof(outbuf);
+	
+		cd = iconv_open(m_szToCodepage, m_szFromCodepage);
+		
+		iconv_result = iconv(cd, &inptr, &ileft, &outptr, &oleft);
+		
+		
+		outbuf[ICONV_BUF_SIZE-oleft] = 0;
+		strcpy(G.filename, outbuf);
+		
+		iconv_close(cd);
+				
 
         if (G.pInfo->lcflag)      /* replace with lowercase filename */
             STRLOWER(G.filename, G.filename);
diff --color -urN unzip60.orig/utf.h unzip60/utf.h
--- unzip60.orig/utf.h	1970-01-01 09:00:00.000000000 +0900
+++ unzip60/utf.h	2025-03-06 22:06:45.791956221 +0900
@@ -0,0 +1,22 @@
+/* copied from ganadist's code */
+char *getLegacyCharset() {
+	char *enc = getenv("ZIPENC"); /* barosl is misonyeon */
+	if (enc) return enc;
+	char *lang = getenv("LANG");
+	if(!lang) return "UHC";
+	if(!strncmp(lang, "ko", 2)) return "UHC";
+	if(!strncmp(lang, "zh_TW", 5)) return "BIG5";
+	if(!strncmp(lang, "zh_GB", 5)) return "GB2312";
+	if(!strncmp(lang, "ja", 2)) return "SHIFT-JIS"; /* modified from "EUC-JP" */
+	if(!strncmp(lang, "ru", 2)) return "KOI8-R";
+	if(!strncmp(lang, "uk", 2)) return "KOI8-U";
+	if(!strncmp(lang, "th", 2)) return "TIS-620";
+	if(!strncmp(lang, "vi", 2)) return "TCVN";
+	return "UHC";
+}
+
+/* copied from bluetux's code */
+char m_szToCodepage[256];
+char m_szFromCodepage[256];
+strcpy(m_szToCodepage, "UTF-8"); /* barosl.com is not manghan */
+strcpy(m_szFromCodepage, getLegacyCharset()); /* instead of "CP949" */

데비안 패키지 제작을 읽고 적당히 패키지를 만드십시오.

적용된 deb 바이너리 파일: (데비안 trixie 또는 sid 또는 ubuntu-25.04 또는 ??)

unzip_6.0-28.1_amd64.deb
0.16MB

Gui tool

가능하다면, 그래픽 사용자 인터페이스에서도 인코딩을 읽어서 자동으로 해결되기를 원할 수 있습니다.

아주 오래 전에는 LANG=ko_KR.EUC-KR을 사용했지만, 메뉴에서 한/영 혼재가 거슬려서 메뉴 자체를 전체적으로 영어로 만들기 위해, LANG=en_US.UTF-8을 사용해 왔습니다.

이러다 보니, 그놈 FileRoller에서 같은 상황에서 마찬가지로 한글이 깨집니다.

어쨌든, 어떤 GUI 도구라도 윈도우에서 만든 zip 파일에서 한글 표현이 잘 되기를 원할 수 있습니다. 이를 위해, 그 동안 Wine (software)을 설치하고 반디집을 설치해서 사용해 왔습니다.

그러나, 반디집은 7.x 버전에서 너무 자주 업데이트가 되고, 광고까지 붙어 있어서 사용하기에 꺼려질 수 있습니다.

이를 대체하기 위해, 7Zip, WinRAR와 같은 도구를 와인으로 설치했지만, 그런 옵션 자체가 없는 것으로 보입니다.

한편, arkzip과 같은 도구가 있었지만, qt-4 이후로는 더 이상 개발이 진행되지 않습니다.

결론적으로, 해결책은 너무나 간단합니다.

명령-줄에서 환경 변수를 통해 이를 해결할 수 있습니다:

  • LANG=ko_KR.UTF-8 file-roller

게다가, 노틸러스 파일 관리기에서 file-roller를 불러서 사용할 것이므로, alias를 만들거나, 아니면, .desktop 파일에 환경 변수를 넣어서 해결할 수 있습니다. (후자의 방법을 사용 중입니다)

  • cd ~/.local/share/applications
  • cp /usr/share/applications/org.gnome.FileRoller.desktop .
  • gvim org.gnome.FileRoller.desktop
TryExec=file-roller
Exec=env LANG=ko_KR.UTF-8 file-roller %U
StartupNotify=true