2013-04-12 61 views
1

wchar_t的。如果我知道這2中國性格你好str中的Unicode碼點轉換碼點在C

我如何轉換這個字符*海峽碼點,以中國文字,並將其指定爲wchar_t * WSTR?

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

我知道我可以直接指定這樣和問題解決。

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

但我的問題比這更復雜,我的情況不允許。

我該如何做文字代碼轉換爲wchar_t *?

謝謝。

我正在使用MS Visual C與字符集設置爲MBCS,假設我不能使用UNICODE字符集。

UPDATE: 對不起,只是校正的wchar_t的WSTRwchar_t的* WSTR

UPDATE 炭* STR包含的UTF-8編碼單元序列,對於2中國字符你好

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代碼點的十六進制代碼的char * MBCS應該採用什麼編碼? – RedX

+0

@WhozCraig:是的,對不起,我剛剛糾正了這一點。 – William

+0

@RedX:是的,我有一個char *,它有很多由空格分隔的unicode codepoint。我需要將其轉換爲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和fifth和第六個字符\ x也在前進之前。但這是更健壯代碼的起點。這不健壯,也沒有測試過。

編輯: 我假設所有的十六進制值是大寫。