diff -dPNur unzip-5.52/fileio.c unzip-5.52-ds/fileio.c
--- unzip-5.52/fileio.c	2005-02-27 03:10:12.000000000 +0100
+++ unzip-5.52-ds/fileio.c	2008-04-11 22:25:31.000000000 +0200
@@ -78,7 +78,7 @@
 #  endif
 #endif
 #include "ebcdic.h"   /* definition/initialization of ebcdic[] */
-
+#include "dsrecode.h"
 
 /*
    Note: Under Windows, the maximum size of the buffer that can be used
diff -dPNur unzip-5.52/unzpriv.h unzip-5.52-ds/unzpriv.h
--- unzip-5.52/unzpriv.h	2005-02-04 00:26:42.000000000 +0100
+++ unzip-5.52-ds/unzpriv.h	2008-04-11 22:25:31.000000000 +0200
@@ -2564,9 +2564,9 @@
            ((hostver) == 25 || (hostver) == 26 || (hostver) == 40))) || \
         (hostnum) == FS_HPFS_ || \
         ((hostnum) == FS_NTFS_ && (hostver) == 50)) { \
-        _OEM_INTERN((string)); \
+        _DS_OEM_INTERN((string)); \
     } else { \
-        _ISO_INTERN((string)); \
+        _DS_ISO_INTERN((string)); \
     }
 #endif
 
diff -dPNur unzip-5.52/dsrecode.h unzip-5.52-ds/dsrecode.h
--- unzip-5.52/dsrecode.h	1970-01-01 01:00:00.000000000 +0100
+++ unzip-5.52-ds/dsrecode.h	2008-04-11 22:24:24.000000000 +0200
@@ -0,0 +1,118 @@
+#include "librcc.h"
+
+static rcc_class_default_charset default_oem[] = {
+    { "ru", "IBM866" },
+    { NULL, NULL }
+};
+
+static rcc_class_default_charset default_iso[] = {
+    { "ru", "CP1251" },
+    { NULL, NULL }
+};
+
+#define OEM_CLASS 0
+#define ISO_CLASS 1
+#define OUT_CLASS 2
+static rcc_class classes[] = {
+    { "oem", RCC_CLASS_STANDARD, NULL, default_oem, "OEM_INTERN", 0 },
+    { "iso", RCC_CLASS_STANDARD, NULL, default_iso, "ISO_INTERN", 0 },
+    { "out", RCC_CLASS_STANDARD, "LC_CTYPE", NULL, "Output", 0 },
+    { NULL }
+};
+
+int initialized = 0;
+
+#ifdef RCC_LAZY	
+#include <dlfcn.h>
+# define RCC_LIBRARY "librcc.so.0"
+int (*rccInit2)();
+int (*rccFree2)();
+int (*rccInitDefaultContext2)(const char *locale_variable, unsigned int max_languages, unsigned int max_classes, rcc_class_ptr defclasses, rcc_init_flags flags);
+int (*rccInitDb42)(rcc_context ctx, const char *name, rcc_db4_flags flags); 
+char* (*rccSizedRecode2)(rcc_context ctx, rcc_class_id from, rcc_class_id to, const char *buf, size_t len, size_t *rlen);
+int (*rccLoad2)(rcc_context ctx, const char *name);
+
+
+static char *rccRecode2(rcc_context ctx, rcc_class_id from, rcc_class_id to, const char *buf) {
+    return rccSizedRecode2(ctx, from, to, buf, 0, NULL);
+}
+
+void *rcc_handle;
+#else /* RCC_LAZY */
+#define rccInit2 rccInit
+#define rccFree2 rccFree
+#define rccInitDefaultContext2 rccInitDefaultContext
+#define rccInitDb42 rccInitDb4
+#define rccRecode2 rccRecode 
+#define rccLoad2 rccLoad
+#endif /* RCC_LAZY */
+
+static void rccUnzipFree() {
+    if (initialized > 0) {
+	rccFree2();
+#ifdef RCC_LAZY	
+	dlclose(rcc_handle);
+#endif /* RCC_LAZY */
+	initialized = 0;
+    }
+}
+
+
+static int rccUnzipInit() {
+    if (initialized) return 0;
+    
+#ifdef RCC_LAZY	
+    rcc_handle = dlopen(RCC_LIBRARY, RTLD_NOW);
+    if (!rcc_handle) {
+	initialized = -1;
+	return 1;
+    }
+    
+    rccInit2 = dlsym(rcc_handle, "rccInit");
+    rccFree2 = dlsym(rcc_handle, "rccFree");
+    rccInitDefaultContext2 = dlsym(rcc_handle, "rccInitDefaultContext");
+    rccInitDb42 = dlsym(rcc_handle, "rccInitDb4");
+    rccSizedRecode2 = dlsym(rcc_handle, "rccSizedRecode");
+    rccLoad2 = dlsym(rcc_handle, "rccLoad");
+    
+    if ((!rccInit2)||(!rccFree2)||(!rccInitDefaultContext2)||(!rccInitDb42)||(!rccSizedRecode2)||(!rccLoad2)) {
+	dlclose(rcc_handle);
+	initialized = -1;
+	return 1;
+    }
+#endif /* RCC_LAZY */
+    
+    rccInit2();
+    rccInitDefaultContext2(NULL, 0, 0, classes, 0);
+    rccLoad2(NULL, "zip");
+    rccInitDb42(NULL, NULL, 0);
+    atexit(rccUnzipFree);
+    initialized = 1;
+    return 0;
+}
+
+
+
+void _DS_OEM_INTERN(char *string) {
+    char *str;
+    rccUnzipInit();
+    if (initialized>0) {
+	str = rccRecode2(NULL, OEM_CLASS, OUT_CLASS, string);
+	if (str) {
+	    strncpy(string,str,FILNAMSIZ);
+	    free(str);
+	}
+    }
+}
+
+void _DS_ISO_INTERN(char *string) {
+    char *str;
+    rccUnzipInit();
+    if (initialized>0) {
+	str = rccRecode2(NULL, ISO_CLASS, OUT_CLASS, string);
+	if (str) {
+	    strncpy(string,str,FILNAMSIZ);
+	    free(str);
+	}
+    }
+}