JNBridgePro와 한글 인코딩 문제
지난번 글에서 JNBridgePro 사용법을 알아봤는데요.
JNBridgePro를 이용해 C#에서 Java메서드 호출 테스트
; https://www.sysnet.pe.kr/2/0/1552
동료에게 Java의 인코딩 관련한 내용을 듣고서 간단하게 문제를 다시 테스트해 보았습니다.
이를 위해 파일을 읽는 소스코드를 만들고,
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);
}
}
이클립스에서 프로젝트 설정을 UTF-8로 설정한 후,
컴파일 된 .class 파일을 얻어냈습니다. 이제 "JNBProxy v7.1 proxy generation tool (.NET 4.0-targeted)"를 실행해 "Project" / "Edit Classpath..." 메뉴로 .class 파일이 있는 폴더를 선택하고,
이어서 "Project" / "Add Classes from Classpath..." 메뉴를 통해 위의 예제로 만들었던 클래스의 전체 이름을 (패키지가 없으니 단순하게) "testC"로 입력해 줍니다.
패키지 명이 없으니, "Environment" 트리에는 "<<default package>>" 항목으로 나오고 이를 "Add =>" 버튼으로 "Exposed Proxies" 트리로 추가한 다음 역시 "<<default package>>" 항목을 선택한 후 "Project" / "Build..." 메뉴를 선택해 주면 .NET에서 사용할 수 있는 proxy dll 어셈블리 파일이 생성됩니다.
프록시 생성을 마치고 예제 C# 프로젝트를 만들어 다음의 4개 파일을 "Add as Link"로 추가하고 "Copy to Output Directory" 옵션을 "Copy if newer"로 설정한 다음,
- bcel-5.1-jnbridge.jar
- jnbcore.jar
- rlm932_x86.dll
- testC.class
JNB 관련 어셈블리와 proxy dll을 참조 추가하고,
- JNBShare.dll
- JNBSharedMem_x86.dll
- EncTest.dll
app.config 설정까지 완료해 줍니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="jnbridge">
<section name="dotNetToJavaConfig"
type="System.Configuration.SingleTagSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</sectionGroup>
</configSections>
<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>
</configuration>
마지막으로 C#에서 자바 클래스를 호출해주면 되겠지요? ^^
class Program
{
static void Main(string[] args)
{
testC tc = new testC();
tc.WriteText("test.json");
}
}
테스트를 위해 test.json 파일을 Visual Studio에서 열어 "Unicode (UTF-8 without signature) - Codepage 65001"로 인코딩 옵션을 변경해 저장한 후 C# 프로그램을 호출하면 어떻게 될까요?
이클립스에서는 위와 같은 경우에 정상적으로 test.json 파일에 포함된 '한글' 내용을 출력할 수 있지만 JNBridgePro를 통해 생성된 proxy dll을 경유해 C#에서 호출하게 되면 UTF-8 형식의 파일을 읽어들이지 못합니다.
하지만 test.json 파일을 시스템 디폴트 인코딩 타입이 적용되도록 ANSI로 저장하면 출력이 정상적으로 나옵니다.
즉, 이클립스에서 UTF-8 인코딩 설정을 한 것이 C# 응용 프로그램 실행에서는 무관하게 동작을 한 것입니다. 이로써 문제는 파악되었지만 자바 라이브러리를 사용하려는 입장에서는 딱히 해결 방법이 없으니 아쉽게 되었습니다. 결국 이 문제를 제대로 해결하려면 사용하려는 java 라이브러리 측에서 BOM을 인식해 동작하는 코드를 만들어 주어야만 가능하다는 이야기가 됩니다.
역시 이번 글에 대한 테스트 코드도 첨부합니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]