JSON의 유니 코드 이스케이프 처리에 ICU 사용

9617 단어 C++ICUC유니코드

유니코드 이스케이프 대응



JSON 형식에서는, GET나 POST로 Web서버에 요구를 보내면(자) 일본어의 캐릭터 라인은 아래의 예와 같이 유니코드 이스케이프 처리되어 돌아옵니다.

Json 문자열의 일부
"Type":"A10","Code":"9876","Name":"\u3053\u3093\u306b\u3061\u306f"

위의 예에 있는 선두의/u3053은 일본어의 「코」로 16비트의 코드 포인트입니다. 5문자를 아울러 「안녕하세요」가 됩니다.

코드 포인트를 C/C++로 일본어로 하는 경우, 매우 고도의 C의 지식이 필요하게 되어 코드량이 증가합니다. 이를 피하기 위해 ICU를 사용합니다.

ICU를 사용하면 웹 시대에 Windows 응용 프로그램을 프로그래밍하는 것이 더 쉬울 것입니다.

What is ICU?



International Components for Unicode를 약어하여 ICU라고 합니다. 유니 코드를 다루는 오픈 소스 라이브러리입니다.

C/C++, JAVA에서 이 라이브러리를 이용하여 어플리케이션을 작성할 수 있습니다. 세계 선도적인 IT 기업들이 ICU를 활용하여 애플리케이션을 구축하고 있습니다.

지금까지 광범위하게 이용되고 계속 성숙된 내용으로 진화하고 있습니다. 지금도 자주 업데이트되고 있다.

다운로드 및 환경 구축



PC의 환경으로서 Windows10, Visual Studio 2017을 전제로 하고 있습니다.

ICU 소스 코드를 홈페이지 다운로드 사이트에서 다운로드하십시오.
ICU4C는 C용 소스입니다.
ICU4C Source Code Download 항목에서 ZIP file for Windows platforms를 선택합니다.
파일 이름은 icu4c-62_1-src.zip이지만 62_1은 릴리스 번호입니다.
git-hub의 경우 여기 다운로드하십시오.

다운로드가 끝나면 모든 폴더에 압축을 풀고 icu 폴더가 있는지 확인합니다.
그 안에 있는 source 폴더의 allinone이라는 폴더를 열고 Visual studio에서 솔루션 파일 "allinone.sln"을 엽니다. 열면 릴리스 모드로 빌드합니다.

빌드가 완료되면 icu 폴더 바로 아래에 lib, bin 폴더가 각각 생성됩니다.
이제 icu 폴더를 C 드라이브 바로 아래로 옮깁니다 (폴더를 넣을 위치는 모든 위치에서 OK입니다).

path를 통과시키기 위해 Windows 환경 변수의 path 항목에 c:\icu\bin을 추가합니다.

ICU를 사용하려는 프로젝트를 만들고 속성 → 링커 → 입력 → 추가 종속성에 다음 파일을 추가합니다.

추가 종속 파일(copipe)
icuuc.lib;icuin.lib



마찬가지로 라이브러리 디렉토리에 c:\icu\lib와 포함 디렉토리에 C:\icu\include를 추가합니다.



프로젝트 폴더의 소스 파일(cpp/c 파일)이 있는 위치에 다음 파일을 icu 폴더에서 복사하여 붙여넣습니다.

다음 파일을 프로젝트 폴더에 복사

icuin62.dll
icuuc62.dll
icudt62.dll

Coding with C



이번에는 C에서 유니 코드 코드 포인트에서 CString 형식으로 변환합니다.

Coding_With_C
// Visual C++ の CLR、 CLR empty projectで作成。
// Visual StudioからMFC関連のAPIを導入してください。

#include <atlstr.h>
#include <unicode\unistr.h> // ICUのヘッダーを追加する。

int main() {

// WEBサーバーからのJSON形式のレスポンスの一部。(constにはできない文字列。)
    char src[] = "\"Type\":\"A10\",\"Code\":\"9876\",\"Name\":\"\\u3053\\u3093\\u306b\\u3061\\u306f\"";
    char separator[] = "\\u"; //区切り文字をセット。
    char dq[] = "\"";
    char targetWord[] = "Name\":\""; // ターゲットとなる項目の文字列を選ぶ。
    char* pSrc = NULL;
    char* gotWord = NULL;
    char* answer = NULL;
    char* token = NULL;
    char temp[256];
    icu::UnicodeString uniStr;
    CString strCstr;
    HWND hWnd = NULL;

    pSrc = strstr(src, targetWord); // ターゲットの文字列の先頭にポインターを移す。
    pSrc += strlen(targetWord); // ターゲット項目の文字列の数だけポインターをずらす。
    gotWord = strtok_s(pSrc, dq, &token);// ポインター位置からダブルクオーテーションまでの文字を抜き出す。

    answer = strtok_s(gotWord, separator, &token);//区切り文字を「\\u」として、文字列を抽出する。
    while (answer != NULL) {

        strcpy_s(temp, sizeof(temp), "0x");
        strcat_s(temp, sizeof(temp), answer); //文字列を0xXXXXに変換する。
        uniStr = strtol(temp, NULL, 16); // ICUのUnicodeStringに16進数へ変換した文字を入れる。
        strCstr.AppendFormat(_T("%s"), uniStr.getTerminatedBuffer()); // CString形式に変換して文字を追加する。

        answer = strtok_s(NULL, separator, &token);//次の文字列を探す。
    }

    MessageBox(hWnd, strCstr, _T("Message"), MB_OK | MB_ICONINFORMATION);//メッセージを表示する。

    return 0;
}

좋은 웹페이지 즐겨찾기