통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
데브피아 C# 포럼 마을에 오신 것을 환영합니다.
  마을등급 C#   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 비사모 주민 12802 since 2006-12-28
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
[마을 게시판]
구인/구직 게시판
건의 / 운영 제안
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 자료실
 Clipboard 에서 Html 소스 받아오기.  | WinForm Program 2007-01-14 오전 4:22:11
 beakdu  beakdu님께 메시지 보내기beakdu님을 내 주소록에 추가합니다.beakdu님의 개인게시판 가기 번호: 21266  / 읽음:4,907

Clipboard 에서 Html 소스 받아오기.

 

1. 윈도우 Clipboard에서 Html 소스 다루는 원리.

 

- 웹브라우져에서 복사할 부분을 선택하여 복사를 합니다.

- Html Format , Text, Local, Rtf 형태로 Clipboard로 저장이 됩니다.

  이때 Text같은 경우는 시스템의 ASCII 페이지에 맞춰서 인코딩 (Encoding.Default, Encoding.GetEncoding(949))되어 들어갑니다.

  그래서 C#코드에서 Clipboard.GetData(DataFormats.Text) 해서 받아도 글자가 깨지지 않고 한글을 받아 올 수 있습니다.

  하지만 불행이도 Html 소스 는 Clipboard로 저장이 될 때 utf-8로 인코딩되어 저장이 됩니다.

  한마디로 시스템에서 2byte로 사용되는 한글을 3byte로 인코딩해서 저장이 된다는 것이죠..

 

- Clipboard.GetData(DataFormats.Html)을 이용하여 Html 소스 받기를 시도 합니다.

  보통 C#에서는 .ToString()이나 Convert.ToString (object)를 사용을 하게 됩니다.

  여기서 이와 같은 메서드들은 시스템의 기본 코드페이지 즉 Default 인코딩을 사용하게 되는 것입니다.

  그러다 보니 저장은 3byte의 utf-8로 저장이 되어 있는데 그걸 Default(한글기준.) 2byte로

  읽어 들이니 ascii 코드를 제외한 다른 글자들은 원상복구 시키는게 불가능해 집니다.

 

==> 위와 같은 결과를 봤을 때 쉽게 생각이 나시는 분들이 계실꺼라 생각합니다.

   맞습니다. ^^ .ToString() 이나 Convert.ToString()을 쓰지 않고 byte[]로 받아서

   Encoding.UTF8을 이용하여 디코딩하면 되는 것입니다....

   하지만 불행이도 C#에서는 GetData()를 실행하는 동시에 내부적으로 Default로 디코딩 해버려서

   원본 byte[]를 가져올 방법이 없습니다. ~~~

 

2. API함수를 이용하여 byte[]가져오기..

- 우선 사용될 API 함수 선언 부분입니다.

 

    [DllImport("user32.dll")]

    public static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [DllImport("user32.dll")]

    public static extern bool EmptyClipboard();

    [DllImport("user32.dll")]

    public static extern bool CloseClipboard();

    [DllImport("user32.dll")]

    public static extern IntPtr GetClipboardData(IntPtr uFormat);

    [DllImport("user32.dll",EntryPoint="RegisterClipboardFormatA")]

    public static extern IntPtr RegisterClipboardFormat (string strFormatName);

  메서드 이름만 봐도 어떻게 사용되는 것인지 다들 아실꺼라 생각하고 설명은 하지 않겠습니다.

 

- API함수를 이용하여 html소스 받아 오는 부분입니다.

        public string GetHTMLClipboard ()

        {

            string sHtmlCode = "";

 

            if ( false != OpenClipboard (this.Handle)) //클립보드 열기.

            {

                IntPtr hMemHandle, nHtmlFormat;

                nHtmlFormat = RegisterClipboardFormat (DataFormats.Html); //HTML Format 등록 및 해당 포인터 받아오기.

 

                hMemHandle = GetClipboardData (nHtmlFormat); // 데이터 받아오기.

 

                if (0 != (int)hMemHandle) // 자료 체크...

                {

                    int buffersize = GetClipboardDataSize (hMemHandle) ; // 임의로 만든 데이터 크기 구하기 메서드 이용.

                    byte [] data = new byte [buffersize];

                    Marshal.Copy (hMemHandle, data, 0, buffersize); // Clipboard 의 자료를 byte[]로 복사.

                    sHtmlCode = Encoding.UTF8.GetString (data); // utf-8로 디코딩...

                }

                CloseClipboard (); // 클리보드 닫기.

 

                // Html 소스 저장 구조가 좀 복잡한데.. <body> 내부의 값만을 가져오기 위한 작업입니다....

                int startPos=sHtmlCode.IndexOf("<!--StartFragment-->")+20;      

                int endPos=sHtmlCode.IndexOf("<!--EndFragment-->");     

                if (startPos < endPos)

                    sHtmlCode=sHtmlCode.Substring(startPos,endPos-startPos);// 필요한 Html Source로 만든다. 

            }

 

            return sHtmlCode;

        }

 

        // 고민 끝에 만든건데..  제 기능을 하긴 합니다. 하지만 확실치 않으니 사용시 주의 하세요..

        public int GetClipboardDataSize (IntPtr start)

        {

            int pLength = 0;

            int offset = 1;

            while (0 < Marshal.ReadByte (start))

            {

                pLength ++;

                start = (IntPtr)(((int)start)+offset);

            }

            

            return pLength;

        }

 

==> 메서드를 보면 아시겠지만 API를 상요하여 byte[]를 받아오면 Clipboard에 저장된 자료를 손상되지 않은 상태로 받아올 수 있기

    때문에 깨지지 않은 한글을 받아 올 수 있습니다.

 

3. DhtmlEditer 를 사용하여 프로젝트 할 때 툴바나 ContextMenu를 만들어서 Html코드를 붙여넣기 하고 싶을 때 유용하게 사용할 수 있을 꺼라 생각합니다.

 

 

### 정리하다 보니 별것두 아닌 것 같은데.. 전 이작업을 하는데 꼬박 하루가 걸렸습니다. 접해보지 못한 부분이 많아서..

    특히 API는 처음이라.. 사용법, 메서드 이름 등등...  데뷰피아 들어와서 검색을 해봤는데 질문만 있고 답변은 없더군요..

    그게 너무 아쉬워서.. 이렇게 글을 남기게 되었습니다.   저와 같은 문제로 고생하시는 분들 이글을 보고 부디 쉽게 일처리 했으면 합니다...^^^

[코멘트] 좋음
2007-01-23 03:00
 nahyojinee  nahyojinee님께 메시지 보내기nahyojinee님을 내 주소록에 추가합니다.nahyojinee님의 개인게시판 가기 
수고하셨습니다.
유용하게 쓰일데가 있을거 같네요 ^^
저장 취소
[코멘트] 좋음
2007-05-14 15:43
 moningday  moningday님께 메시지 보내기moningday님을 내 주소록에 추가합니다.moningday님의 개인게시판 가기 
좋은글 입니다.
요즘..힘들게 알아낸 노하우나..소스를 공개하는 사람이 부쩍 줄엇습니다.
덱스퍼트같은...것 때문일까요..?^^
외국엔선 GPL 이니 머니 활발한데...^^;;
점수주기외엔..고마움의 표현할길이 ..^^
저장 취소
[코멘트] 좋음
2014-05-30 14:46
 crash168  crash168님께 메시지 보내기crash168님을 내 주소록에 추가합니다.crash168님의 개인게시판 가기 
아~ 정말 좋은글 감사합니다.
2007년에 쓰신글이 아직도 단비와 같네요.
행복한 일 가득하시길 바랍니다. ^^
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.