Annotation: Sometimes there might be a problem converting UTF-8 to zips native charset(CP866), because it's not 1:1 conversion. So my solution is to allow developers provide their own version of converted filename and pass it to mod_zip along with UTF-8 filename which will go straight to Unicode path extra field (thanks to tony2001). So separator is a solution that doesn't break current format. And allows passing file name in both formats as one string. Normally we pass: CRC32 <size> <path> <filename>\n ... * <filename> passed to archive as filename w/o conversion * UFT-8 flag for filename is set tony2001's X-Archive-Charset: <charset> way: CRC32 <size> <path> <filename>\n ... * <filename> is accepted to be UTF-8 string * <filename>, converted to <charset> and passed to archive as filename * <filename> passed to Unicode path extra field * UFT-8 flag for filename is not set My X-Archive-Name-Sep: <sep> solution: CRC32 <size> <path> <native-filename><sep><utf8-filename>\n ... * <native-filename> passed to archive as filename w/o conversion * <utf8-filename> passed to Unicode path extra field * UFT-8 flag for filename is not set You just need to provide separator that won't interfere with file names. I suggest using '/' as it is ASCII character and forbidden on most (if not all) platforms as a part of filename. Empty separator string means no UTF-8 version provided. Usefull when we need to pass only names encoded in native charset. It's equal to 'X-Archive-Charset: native;'. Note: Currently it is impossible after '[PATCH] Support for UTF-8 file names.'(4f61592) because UFT-8 flag (zip_utf8_flag) is set default for templates.