2013-04-12 7 views
1

wchar_t를하고 * WSTR을 wchar_t를에 할당?변환 코드 포인트는 내가 중국어 문자</p> <p>가 어떻게이의 char * str을 코드 포인트를 변환 할 수 있습니다 STR에서 你好이 2 중국어 문자의 유니 코드 코드 포인트를 알고 있다면 C

char * str = "4F60 597D"; 
wchar_t * wstr; 

내가 직접 할당 할 수 있고 문제가 해결되었다는 것을 알고 있습니다.

wchar_t * wstr = L"\u4F60\u597D"; 

그러나 제 문제는 그보다 복잡합니다. 제 상황에서는 그렇게 할 수 없습니다.

리터럴 코드 포인트에서 wchar_t * 로의 변환을 어떻게 수행합니까?

감사합니다.

charset이 MBCS로 설정된 MS Visual C를 사용하고 있는데 유니 코드 문자 세트를 사용할 수 없다고 가정합니다.

UPDATE는 : 죄송 단지 같이 wchar_t *의 WSTR에 같이 wchar_t WSTR 수정

UPDATE 숯 * STR 2 중국어 문자, UTF-8 코드 유닛들의 시퀀스를 포함你好

char * str = "\xE4\xBD\xA0\xE5\xA5\xBD";  
size_t len = strlen(str) + 1; 
wchar_t * wstr = new wchar_t[len]; 
size_t convertedSize = 0; 
_locale_t local = _create_locale(LC_ALL , "Chinese"); 
_mbstowcs_s_l(&convertedSize, wstr, len, str, _TRUNCATE, local); 
MessageBoxW(NULL, wstr , (LPCWSTR)L"Hello", MB_OK); 

왜 MessageBox는 일본어 문자를 출력합니까? 중국어 대신에? 사용할 로케일 이름은 무엇입니까?

+0

이 질문은 다소 혼란 스럽습니다. 지금 정확히 무엇을 가지고 있습니까? UNICODE 코드 포인트를 나타내는 16 진수 코드가 많은'char *'? 그리고 MBCS가 어떤 인코딩을해야합니까? – RedX

+0

@WhozCraig : 예, 죄송합니다. 방금 문제를 해결했습니다. – William

+0

@RedX : 네, 우주에서 분리 된 많은 유니 코드 코드 포인트를 가진 char *을 가지고 있습니다. wchar_t *로 변환해야합니다. "MBCS가되어야하는 인코딩이 무엇인지 이해하지 못해 죄송합니다." – William

답변

0

나는이 기능에 대해 생각 할 수 있습니다

#define GetValFromHex(x) (x > '9' ? x-'A'+10 : x - '0') 

wchar_t GetChineesChar(const char* strInput) 
{ 
    wchar_t result = 0; 
    LPBYTE ptr = (LPBYTE)&result; 

    ptr[0] = GetValFromHex(strInput[2]) * 16 + GetValFromHex(strInput[3]); 
    ptr[1] = GetValFromHex(strInput[6]) * 16 + GetValFromHex(strInput[7]); 

    return result; 
} 

wchatr_t* GetChineesString(const char* strInput) 
{ 
    size_t len = strlen(strInput)/8; 
    wchar_t* returnVal = new wchar_t[len]; 
    for (int i = 0; i < len; i++) 
    { 
     returnVal[i] = GetChineesChar(&strInput[i*8]); 
    } 
    return returnVal; 
} 

그럼 그냥 (GetChineesString를 호출해야합니다) 당연히 앞쪽으로 이동하기 전에 첫 번째 두 글자가 \ x이고 다섯 번째와 여섯 번째 글자가 \ x 확인되도록 확인을 더 추가 할 수 있습니다. 그러나 이것은보다 견고한 코드의 출발점입니다. 이것은 견고하지도 않고 테스트도되지 않습니다.

편집 : 모든 16 진수 값이 대문자라고 가정합니다.