2013-11-28 7 views
3

우리 회사는이 같은 일부 코드를 사용 : 나는 (그 유형 CString을) 유니 코드 문자열로 변환 생각C는 + + : 표준 : : 문자열을 UTF8 저장에 ASCII 또는 ANSI로 변환하는 방법

std::string(CT2CA(some_CString)).c_str() 

ANSI 인코딩이며이 문자열은 전자 메일의 제목입니다. 그러나 전자 메일 제목 (제목 포함)은 메일 클라이언트가 유니 코드로 디코딩해야 함을 나타냅니다 (원래 코드의 방식입니다). 따라서 "ä ö ü"와 같은 일부 독일어 문자는 제목으로 제대로 표시되지 않습니다.

어쨌든이 헤더를 UTF8에 저장하고 std :: string 또는 const char *에 저장할 수 있습니까?

이 작업을 더 스마트하게 수행 할 수있는 방법이 많이 있지만 코드를 원래대로 유지해야합니다 (예 : 헤더를 std :: string 또는 const char *로 보냄).

미리 감사드립니다.

+0

아마 std :: wstring을 원할 것입니다. – ScarletAmaranth

+0

utf8로 변환되는 미리 만들어진 매크로가 없습니다. 그냥 직접 작성하여 CP_UTF8로 WideCharToMultiByte()를 호출하십시오. –

답변

3

이것은 한 인코딩에서 다른 인코딩으로의 평범한 변환처럼 들립니다.이 경우 std::codecvt<char, char, mbstate_t>을 사용할 수 있습니다. 귀하의 구현이 적절한 변환으로 제공되는지 여부와 상관없이 나는 잘 모릅니다. 그것의 소리에서 당신은 ISO-Latin-1을 유니 코드로 변환하려고합니다. 이는 꽤 사소한 일입니다. 처음 128 자는 UTF-8과 동일하게 매핑되고 (0-127) 두 번째 반쪽은 해당 유니 코드 코드 포인트에 편리하게 매핑됩니다. 즉, 해당 값을 UTF-8로 인코딩하면됩니다. 각 문자는 두 문자로 바뀝니다. 이 변환은 다음과 같을 것입니다 :

// Takes the next position and the end of a buffer as first two arguments and the 
// character to convert from ISO-Latin-1 as third argument. 
// Returns a pointer to end of the produced sequence. 
char* iso_latin_1_to_utf8(char* buffer, char* end, unsigned char c) { 
    if (c < 128) { 
     if (buffer == end) { throw std::runtime_error("out of space"); } 
     *buffer++ = c; 
    } 
    else { 
     if (end - buffer < 2) { throw std::runtime_error("out of space"); } 
     *buffer++ = 0xC0 & (c >> 6); 
     *buffer++ = 0x80 & (c & 0x3f); 
    } 
    return buffer; 
} 
+0

고마워 친구,이게 내 문제를 해결 했어. – Joe

4

Becareful : 그것은 ' '&'이 아닙니다!

*buffer++ = 0xC0 | (c >> 6); 
*buffer++ = 0x80 | (c & 0x3F); 
관련 문제