외제(?)  라이브러리 갖다 쓸때는 특히나... 항상 한글문제가  있다. 


오늘은 log4cplus 다.


한글인코딩 utf16으로 해서 내보냈더니.. 뻗어버리는 증세 발견 


방법은 간다.


아래 처럼 처리하면 파일에 한글이 잘 저장된다...  단,MS Windows  환경에서 임.


std::string locale_string = text.toLocal8Bit().constData();

LOG4CPLUS_DEBUG(_logger,locale_string.c_str() );



만일 UTF-8로 출력을 내보낼 필요가 있는 경우에는 


std::string utf8_text = text.toUtf8().constData();


이렇게...  

위에서 변수 text   는 QString 인스턴스 이다.


V8 Javascript 엔진을 이용해서 이전 프로젝트에서도 진행했었는데.. 그때는 한글문제가 없었나..?



어째든 이번에도 막바지에 이르러 한글 출력 문제 해결한 내용을 정리해두기로 한다.


여기 메소드의 예는  javascript 에서  실행도중 debug 메시지 출력을 위해서  debugOut()라는 네이티브 함수를 호출하게 되는데 이때 한글을 전달한 경우 C++ 코드에서 이른 정상적으로 디코딩 하기 위한 방법이다. 


개발 상황은 다음과 같다.



1. QtSDK 4.8.4  with MS Visual Studio 2010  환경이다. 

2. V8 엔진에서  컴파일해서 실행할 javascript 파일은 UTF-8로 인코딩 되어있다.

3. Javascript 에서  Native c++ 에서 만든  debugOut()라는 함수를 호출하는 상황.




한글 처리 방법


1.  우선 Javascript 소스파일을 읽어드릴때  UTF-8 디코딩이 잘되어야 겠다.


2.  c++코드에서는  자바스크립트로 부터 호출되어 넘겨받은 UTF-8 문자열을  WString 으로 변환해야 한다. 


3.  그리고 WString을 (char *)형으로 변환하고 다시  QString으로 변환(QString::fromUtf16)하여 넣는다.


코드로 정리하면 아래와 같다.



static v8::Handle<v8::Value> debugOut(const v8::Arguments& args){

...

v8::String::Utf8Value msg(args[0]);


std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8ToWString;

auto wstr = utf8ToWString.from_bytes(*msg);


qDebug() << QString::fromUtf16((const ushort *)wstr.c_str());


return v8::Undefined();

}



결과적으로 보면 별거없는데 이러한 제대로된 변환순서를 찾는 삽질을 할때는  ....








+ Recent posts