성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>JNBridgePro와 한글 인코딩 문제</h1> <p> 지난번 글에서 JNBridgePro 사용법을 알아봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > JNBridgePro를 이용해 C#에서 Java메서드 호출 테스트 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1552'>http://www.sysnet.pe.kr/2/0/1552</a> </pre> <br /> 동료에게 Java의 인코딩 관련한 내용을 듣고서 간단하게 문제를 다시 테스트해 보았습니다.<br /> <br /> 이를 위해 파일을 읽는 소스코드를 만들고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > import java.io.*; public class testC { public void WriteText(String filePath) throws Exception { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); byte [] contents = new byte[4096]; int readLength = fis.read(contents, 0, contents.length); fis.close(); String txt = new String(contents, 0, readLength); System.out.println(txt); } } </pre> <br /> 이클립스에서 프로젝트 설정을 UTF-8로 설정한 후,<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='jnb_enc_test_1.png' src='/SysWebRes/bbs/jnb_enc_test_1.png' /><br /> <br /> 컴파일 된 .class 파일을 얻어냈습니다. 이제 "JNBProxy v7.1 proxy generation tool (.NET 4.0-targeted)"를 실행해 "Project" / "Edit Classpath..." 메뉴로 .class 파일이 있는 폴더를 선택하고,<br /> <br /> <img alt='jnb_enc_test_2.png' src='/SysWebRes/bbs/jnb_enc_test_2.png' /> <br /><br /> 이어서 "Project" / "Add Classes from Classpath..." 메뉴를 통해 위의 예제로 만들었던 클래스의 전체 이름을 (패키지가 없으니 단순하게) "testC"로 입력해 줍니다.<br /> <br /> <img alt='jnb_enc_test_3.png' src='/SysWebRes/bbs/jnb_enc_test_3.png' /> <br /><br /> 패키지 명이 없으니, "Environment" 트리에는 "<<default package>>" 항목으로 나오고 이를 "Add =>" 버튼으로 "Exposed Proxies" 트리로 추가한 다음 역시 "<<default package>>" 항목을 선택한 후 "Project" / "Build..." 메뉴를 선택해 주면 .NET에서 사용할 수 있는 proxy dll 어셈블리 파일이 생성됩니다.<br /> <br /> <img onclick='toggle_img(this)' class='imgView' alt='jnb_enc_test_4.png' src='/SysWebRes/bbs/jnb_enc_test_4.png' /><br /> <br /> <hr style='width: 50%' /><br /> <br /> 프록시 생성을 마치고 예제 C# 프로젝트를 만들어 다음의 4개 파일을 "Add as Link"로 추가하고 "Copy to Output Directory" 옵션을 "Copy if newer"로 설정한 다음,<br /> <br /> <ul> <li>bcel-5.1-jnbridge.jar</li> <li>jnbcore.jar</li> <li>rlm932_x86.dll</li> <li>testC.class</li> </ul> <br /> JNB 관련 어셈블리와 proxy dll을 참조 추가하고,<br /> <br /> <ul> <li>JNBShare.dll</li> <li>JNBSharedMem_x86.dll</li> <li>EncTest.dll</li> </ul> <br /> app.config 설정까지 완료해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <sectionGroup name="jnbridge"> <span style='color: blue; font-weight: bold'> <section name="dotNetToJavaConfig" type="System.Configuration.SingleTagSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/></span> </sectionGroup> </configSections> <span style='color: blue; font-weight: bold'> <jnbridge> <dotNetToJavaConfig scheme="sharedmem" jvm="C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll" jnbcore="jnbcore.jar" bcel="bcel-5.1-jnbridge.jar" classpath=".\"/> </jnbridge></span> </configuration> </pre> <br /> 마지막으로 C#에서 자바 클래스를 호출해주면 되겠지요? ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > class Program { static void Main(string[] args) { testC tc = new testC(); tc.WriteText("test.json"); } } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 테스트를 위해 test.json 파일을 Visual Studio에서 열어 "Unicode (UTF-8 without signature) - Codepage 65001"로 인코딩 옵션을 변경해 저장한 후 C# 프로그램을 호출하면 어떻게 될까요?<br /> <br /> 이클립스에서는 위와 같은 경우에 정상적으로 test.json 파일에 포함된 '한글' 내용을 출력할 수 있지만 JNBridgePro를 통해 생성된 proxy dll을 경유해 C#에서 호출하게 되면 UTF-8 형식의 파일을 읽어들이지 못합니다.<br /> <br /> <img alt='jnb_enc_test_5.png' src='/SysWebRes/bbs/jnb_enc_test_5.png' /> <br /><br /> 하지만 test.json 파일을 시스템 디폴트 인코딩 타입이 적용되도록 ANSI로 저장하면 출력이 정상적으로 나옵니다.<br /> <br /> <img alt='jnb_enc_test_6.png' src='/SysWebRes/bbs/jnb_enc_test_6.png' /> <br /><br /> 즉, 이클립스에서 UTF-8 인코딩 설정을 한 것이 C# 응용 프로그램 실행에서는 무관하게 동작을 한 것입니다. 이로써 문제는 파악되었지만 자바 라이브러리를 사용하려는 입장에서는 딱히 해결 방법이 없으니 아쉽게 되었습니다. 결국 이 문제를 제대로 해결하려면 사용하려는 java 라이브러리 측에서 BOM을 인식해 동작하는 코드를 만들어 주어야만 가능하다는 이야기가 됩니다.<br /> <br /> <a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=814&boardid=331301885'>역시 이번 글에 대한 테스트 코드도 첨부</a>합니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6486
(왼쪽의 숫자를 입력해야 합니다.)