2011-04-09 15 views
0

제 3 자 라이브러리로 전달하기 위해 UTF8 문자열을 생성해야하는데 올바른 체조를 파악하는 데 문제가 있습니다 ... 또한 최악의 경우를 대비하여 C++ Builder 6 및 모든 기능을 사용하여 붙어 있습니다. 예제 CBuilder6에서 명시 적으로 지원하지 않는 std :: string 사용에 대한 대화를 찾았습니다. STL을 사용하지 않고 이것을 달성하고 싶습니다.UTF8 변환

여기까지 제 코드는 지금까지 작동하지 않는 것 같습니다.

wchar_t *SS1; 
char *SS2; 

    SS1 = L"select * from mnemonics;"; 

    int strsize = WideCharToMultiByte(CP_UTF8, 0, SS1, wcslen(SS1), NULL, 0, NULL, NULL); 

    SS2 = new char[strsize+1]; 

    WideCharToMultiByte(CP_UTF8, 0, SS1, wcslen(SS1), SS2, strsize, NULL, NULL); 

SS2를 매개 변수로 전달하면 타사 라이브러리 쵸크가 발생합니다. 필자는 Microsoft의 WideCharToMultiByte를 사용하는 Windows 플랫폼을 사용하고 있지만이 함수 호출은 필요하지 않습니다.이 코드는 Linux에서도 임베디드 플랫폼에서도 컴파일해야하므로이 브릿지를 건너겠습니다. .

현재로서는 STL을 사용하지 않고 wchar_t 또는 char을 UTF8로 인코딩 된 문자열로 변환 할 수 있어야합니다. 임베디드 플랫폼에 STL을 사용하지 않을 것입니다.

감사합니다. 그런

답변

2

뭔가 : 그것은 잘 빌더에서 작동해야 http://code.google.com/p/tiscript/source/browse/trunk/sdk/include/aux-cvt.h

:

extern void someFunctionThatAcceptsUTF8(const char* utf8); 

const char* ss1 = "string in system default multibyte encoding"; 

someFunctionThatAcceptsUTF8(w2u(a2w(ss1))); // that conversion you need: 
               // a2w: "ansi" -> widechar string 
               // w2u: widechar string -> utf8 string. 

당신은 그냥 들고와이 파일을 포함해야합니다. 당신은 여전히 ​​답을 찾고 있다면

+0

내가 찾던 정확히 무엇인지. CBuilder6의 경우 #define을 추가해야만 작동합니다. CBuilder6는 _stricmp (stricmp로 알았습니다)에 대해 알지 못했고 sprintf로 고정 된 _itoa에 대해 알지 못했습니다 ... Nice! 고맙습니다! – Eric

0

, 여기에 C 언어의 UTF8 변환기의 간단한 구현이다 :

/* 
** Transforms a wchar to utf-8, returning a string of converted bytes 
*/ 

void   ft_to_utf8(wchar_t c, unsigned char *buffer) 
{ 
    if (c < (1 << 7)) 
     *buffer++ = (unsigned char)(c); 
    else if (c < (1 << 11)) 
    { 
     *buffer++ = (unsigned char)((c >> 6) | 0xC0); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    else if (c < (1 << 16)) 
    { 
     *buffer++ = (unsigned char)((c >> 12) | 0xE0); 
     *buffer++ = (unsigned char)(((c >> 6) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    else if (c < (1 << 21)) 
    { 
     *buffer++ = (unsigned char)((c >> 18) | 0xF0); 
     *buffer++ = (unsigned char)(((c >> 12) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)(((c >> 6) & 0x3F) | 0x80); 
     *buffer++ = (unsigned char)((c & 0x3F) | 0x80); 
    } 
    *buffer = '\0'; 
}