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();

}



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








v8 빌드 방식이 바뀌어서 이전에 Scons 을 쓰는 것은 deprecated 되었다.

 

GYP 빌드 메타 정보를 생성하는 방법을 사용하는데 윈도우 & MSVC 2010 환경에서 빌드 하는 방법을 정리한다.

 

 

아래 순서로 빌드하면됨

 

1. 소스 다운로드

svn checkout http://v8.googlecode.com/svn/trunk/ v8

2. gyp 다운로드 (v8 빌드를 위한 메타 정보라고 함)

svn co http://gyp.googlecode.com/svn/trunk build/gyp

3. chromium python 다운로드 후 설치

svn co http://src.chromium.org/svn/trunk/tools/third_party/python_26@89111 third_party/python_26

4. chromium 제공  cygwin 설치

svn co  http://src.chromium.org/svn/trunk/deps/third_party/cygwin@66844 third_party/cygwin

5. visual studio 용 sln 파일 만들기

third_party\python_26\python.exe build\gyp_v8 -G msvs_version=2010

Updating projects from gyp files...

만들어진 all.sln 파일을 열고 msvc 에서 빌드 하는데... 아마도  code page 에러 (C4819 warning)가 발생할 것이다.

warning 중간에 나오는 error들도  warning 다량발생을 인한 2차적인 에러이므로 c4819만 잡으면 된다.

===================== 발생 에러 =======================

v8\src\utils.h : error C2220: warning treated as error - no 'object' file generated

v8\src\utils.h : warning C4819: The file contains a character that cannot be represented in the current code page (949). Save the file in Unicode format to prevent data loss

===============================================================

조치 하는 방법은  해당 솔루션에 포함된 프로젝트들(아래그림 참고) 중  소스를 포함하는 프로젝트들을 선택하여 C4819 Warning 이 안 뜨도록 억제해주면 된다.

파란색으로 선택된 프로젝트들만 선택하고 12개 프로젝트 선택하고 속성 창을 띄운다.

선택한뒤  Properties (속성) 창을 띄운다.

그리고 Disable Specific Warnings 에 4819를 추가해줍니다. (아래그림참고)

그리고 나서 빌드 하면 잘됨..




Pre-requisites for all platforms are:

    Subversion 1.4 or higher - see http://sourceforge.net/projects/win32svn/
    Python 2.4 or higher - see http://www.python.org
    SCons 1.0.0 or higher - see http://www.scons.org


Phase 1.  Download V8 source  by SVN

>svn svn checkout http://v8.googlecode.com/svn/trunk/ v8-read-only

>cd v8-read-only

Phase 2. Prepare environment values for MSVC++ 2010

>"C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

Phase 3. build V8  for shared library.

#for release mode library
>scons mode=release library=shared msvcrt=shared env="PATH:%PATH%,LIB:%LIB%,INCLUDE:%INCLUDE%" d8



#for debug mode library
>scons mode=debug library=shared msvcrt=shared env="PATH:%PATH%,LIB:%LIB%,INCLUDE:%INCLUDE%" d8



( When I was choose static mode. V8.lib was too large size more than 200MB and too slow to use in my application build and there were several problems. but shared mode was good! so I suggest shared(dll) mode )

Good luck!

I referred following links.
http://code.google.com/intl/ko-KR/apis/v8/build.html
http://code.google.com/p/v8/wiki/BuildingOnWindows



+ Recent posts