빌더(TWx) 님이 쓰신 글 :
: memi 님이 쓰신 글 :
: : XE2부터 내장된 zip library를 잘 사용했었는데요
: : 한글이 문제네요
: : 아래와 같이 testz 폴더에 새 텍스트 문서.txt 하나 넣고 testz.zip으로 압축한걸 풀면 파일 안의 내용은 멀쩡한데 폴더,파일명 한글 부분이 깨집니다.
: :
: :
: : #include
: : TZipFile *z = new TZipFile;
: : #if 1
: : z->ExtractZipFile("c:\\testz.zip", "c:\\");
: : #else
: : z->Open("c:\\testz.zip",zmRead);
: : String whx;
: : for(int i = 0; i < z->FileCount; i++) {
: : Memo1->Lines->Add(z->FileName[i]); //깨져있는 파일명...
: :
: : wchar_t *wc = z->FileName[i].w_str();
: : whx="";
: : for(int j = 0; j < z->FileName[i].Length(); j++)
: : whx+= IntToHex(wc[j],4) + " ";
: : Memo1->Lines->Add(whx); //깨진 데이터는 어떤 인코딩이길래?
: : }
: : z->Close();
: : #endif
: : delete z;
: :
: :
: : 원하는 값 : testz\새 텍스트 문서.txt
: : 깨져있는 값(깨져서 헥스로) : 0074 0065 0073 0074 007A 002F 2557 2321 0020 253C 256A 255C 2551 255E 00AB 0020 2563 00AB 255D 00A1 002E 0074 0078 0074
: :
: : 새 : 2557 2321 (무슨 네바이트나..)
: : 텍 : 253C 256A
: :
: : 혹시 TZip class 사용해보신 분들 계신가요? 버그인지 혹시 다른 사용법이 있을까요?
:
:
:
: 답변:
:
:
: 엠바에서 구현해 놓은 TZipFile은 파일네임을 처리할 때... 다양한 encoding 방식을 지원하도록 구현 되어있지 않습니다.
:
: RTL에서 디폴트로 정의되어있는 코드페이지가 사용될 수도 있고, UTF8로 encoding 할 때 무조건 코드페이지 65001로 단정하기도
: 해서, 이건 사용하는 RadStudio 버전에 따라서 다르기도 합니다. Zip 파일이 확장된 파일네임 encoding 방식으로 압축될 경우...
: Flag 필드 이외에 Extra 필드가 Zip 파일 내부에 셋팅 되기도 하는데... 엠바가 구현해 놓은 TZipFile은 그런 부분을 고려하는 코드가
: 전혀 구현되어 있지 않습니다.
:
: 동일한 버전의 TZipFile을 이용하지 않은... 다른 도구를 이용해서 Zip 파일이 만들어 졌을 경우... 파일네임이 엉뚱한 문자셋으로
: 보여 질 수 밖에요...
:
: UTF-8 encoding 방식은 1 바이트 ~ 4 바이트 크기의 가변길이로 encoding 됩니다. 사용되는 문자셋 코드페이지에 따라 다르죠.
: 지금 이 PC가 Windows 10인데 Korean Language Pack이 지원되지 않아서, Korean Language 로 셋팅 되어있을 때 탐색기가
: 어떤 코드페이지로 파일네임을 encoding 해서 Zip 파일을 만드는지 확인해 볼수 없네요. Zip 파일을 직접 살펴보지 않고서는...
:
:
ps>
현재 개발환경 PC가 WinRT 프로젝트 진행중인 게 있어서 Windows 10 으로 세팅 되어 있어서 확인해 볼 수가 없네요.
윈도우즈 탐색기를 이용해서 자체 Zip 기능으로 압축 한 파일을 아래 코드로 확인 해보세요.
//---------------------------------------------------------------------------
#include < vcl.h>
#include < system.zip.hpp>
#include < memory>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
std::auto_ptr < TZipFile> z (new TZipFile);
z->Open(L"c:/testz.zip", zmRead);
for(int i = 0; i < z->FileCount; ++i)
{
std::auto_ptr < TEncoding> e (new TMBCSEncoding(0x3B5, 0, 0));
Memo1->Lines->Add(e->GetString(z->FileInfo[i].FileName));
}
}
//---------------------------------------------------------------------------