본문 바로가기

IT/Component

[Devexpress] Xtra RicEditControl HTML 한글폰트 문제




[문제발생]


DevExpress RicEditControl 을 HTML Editor 로 사용하기로함.


툴바도 컴퍼넌트 자체 기능으로 생성해서 기본값을 사용.


근데, 한글 폰트로 설정된 데이터가 포함된 경우 HtmlText 프로퍼티로 내보낸 문자열을 HtmlText 프로퍼티에 그대로 할당하게 되면


한글폰트로 설정된 부분은 기본 폰트로 바뀌어 버리거나, 툴바의 폰트명 콤보박스에 깨진채로 표시됨(한글 폰트 적용 불가)


참고로 확인해 본 결과 저 폰트명 콤보 Item 을 임의로 핸들링 불가 ㅡㅡ;;(Devexpress  Search)




흠.... 아무리 빈 프로젝트를 별도로 생성해서 다시 해보고 또 다시 해봐도 안된다...


한글문제라 HTML Tag 의 charset 과 RicEditControl 의 Import, Export Option 의 Encoding 을 utf-8 로 맞추고 해봐도 안된다...


그래서 여기저기 구글링해가면서 HTML Editor 관련 소스를 뒤지다가... 프린트 출력을 DevExpress XtraReport 로 이미 구현해 놓은

상황인지라(편집/수정/출력 시 동일하게 보이게 하기위해 통일함) 찾은 소스도 도움이 안됨.. ㅠ,.ㅠ

그래서 다시 DevExpress RicEditControl 관련 한글문제를 구글링하기 시작함...

도움안됨.... 아 짱나~

근데, 문득 연결된 툴바에 생성된 SaveAs, Open 버튼이 보이길래 SaveAs 한 다음 다시 그 파일을 그대로 Open 하게 되면 정상동작함.

헐~ 머야....




[해결 과정]


기본생성된 툴바에서 SaveAs 한 다음 다시 그 파일을 그대로 Open 하게 되면 정상동작함.


하지만, 솔루션 특성상 툴바를 사용할수 없음...


그래서 LoadDocument, SaveDocumentAs 메서드 사용해 보기로 함. 이 메서드가 파일경로를 받거나 스트림을 받음


byte[] bytes = System.Text.Encoding.UTF8.GetBytes(wisebiTextEditor1.recWISE.HtmlText);
// 위 소스 처럼 byte array 를 MemoryStream 에 담아서 LoadDocument 를 호출해 봤지만 안됨..
FileStream fs = new FileStream(Path.ChangeExtension(Path.GetTempFileName(),"htm"), FileMode.OpenOrCreate, FileAccess.ReadWrite);
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
fs.Close();
wisebiTextEditor1.recWISE.LoadDocument(fs.Name, DocumentFormat.Html);
// 위 소스 처럼 파일을 직접 생성해서 해도 실패...


2~3 일 동안의 삽질중....

...

..

.


System.Text.Encoding.UTF8.GetBytes 만 믿고 UTF-8 이 확실하다고 넘어간게 문제...

그래서 인코딩에 대해 따로 알아보던중..


[참조 사이트]


http://www.architectshack.com/TextFileEncodingDetector.ashx


http://www.codeproject.com/Articles/17201/Detect-Encoding-for-In-and-Outgoing-Text



[용어]


BOM (Byte Order Mask / Encoding Preamble) WIKI




위 내용을 보고 난 다음에야 드디어 성공 !!!!!!



using(MemoryStream ms = new MemoryStream(bytes.Length + 3))
{
	ms.Position = 0;
	ms.Write(new byte[]{0xef, 0xbb, 0xbf}, 0, 3);
	ms.Position = 3;
	ms.Write(bytes, 0, bytes.Length);
	ms.Flush();
	ms.Position = 0;
	wisebiTextEditor1.recWISE.LoadDocument(ms, DocumentFormat.Html);
	ms.Close();
}
결국 위키에 명시된 데로 Stream 의 처음 3 Byte 를 별도로 설정한 다음 Index 3 부터 실제 데이터를 넣어야 함..

헐...


재차 확인 중에 알게 된 내용이지만 소스에서 임의로 생성한 파일과 툴바에서 저장한 파일을 열어 HEX 모드로 확인해 보니...



좌측이 툴바에서 저장한(제대로 표시되는) 파일이고, 우측이 소스에서 임의로 생성한(실패한) 파일이다..


내용자체는 동일한 내용이라 그냥 텍스트모드로 봤을때는 알수없지만,


이렇게 HEX 모드로 보면 첫 3 Byte 만 틀리고 그 다음은 동일함을 알 수 있었다...


에효.. 아직 출력쪽에는 적용해 보지 않았지만.. 되겠지???

 

 

== 2013-11-01 Update ==

 

일단 리포트 쪽의 편집기는 출력만 하는 용도라

 

값을 할당하는 부분에서 HtmlText 가 아닌 LoadFile 로 데채해서 직접 스트림을 지정하게 변경하니깐 정상적으로 나옴

 

어쩌다 보니 편집화면에서는 Snap 컨트롤로 대체해서 사용하는 걸로 최종 마무리됨

 

툴바생성까지 RichEdit 와 거의~ 모든 부분 동일하게 사용가능 하더라~~~.....

 

단, 어떤 컨트롤을 사용하던지 HtmlText 프로퍼티가 아닌 스트림을 직접 Import 하는 형태로 바꿔었기 때문에

 

HtmlText 프로퍼티에 직접 공백("") 을 할당하게 되면 런타임에 일부 기능(컨트롤 내 복사/붙여넣기 등등)이 오동작 하더라~~..