2013-07-28 67 views
1

我試圖實現函數,它將char *轉換爲wchar_t *。但問題是,wprintf顯示不同的結果。我究竟做錯了什麼?char * to wchar_t *函數實現

wchar_t *toWchar(char *data) 
{ 
    if(!data) 
    { 
     return NULL; 
    } 

    int size = strlen(data); 
    if(!size) 
    { 
     return NULL; 
    } 

    char *temp = (char *)malloc(size * 2); 
    if(!temp) 
    { 
     return NULL; 
    } 

    int j = 0; 
    for(int i = 0; i < size; i++) 
    { 
     temp[j++] = data[i]; 
     temp[j++] = '\0'; 
    } 

    return (wchar_t *)temp; 
} 

編輯: 主要功能:

int main() 
{ 
    wchar_t *temp = toWchar("hello, world!"); 
    if(temp) 
     wprintf("%ls\n", temp); 
    return 0; 
} 
+2

你使用的是什麼編碼?什麼編碼字符,什麼編碼wchar_t?你的代碼可以工作,如果字符是ASCII。並且請注意,您需要添加一個空終止符。 –

+0

嗚嗚,這麼多問題!你能給我一些提示怎麼辦?我只是編程的初學者,我不知道我使用的是哪種編碼。如果這些信息對您有幫助,我在Linux機器上使用普通英語作爲語言環境。 – user2399415

+0

你需要弄清楚你使用的是什麼編碼。你爲什麼要轉換爲wchar_t?你爲什麼不使用庫函數? –

回答

2

作爲起點; GCC會給你依賴於平臺的WCHAR類型/尺寸如下:

echo "" | gcc -E - -dM | grep WCHAR 

#define __WCHAR_MAX__ 2147483647 
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) 
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 
#define __WCHAR_TYPE__ int 
#define __SIZEOF_WCHAR_T__ 4 

A resource表明:

「C和C++介紹固定大小的字符類型char16_t和char32_t在它們各自的標準2011修訂版以提供16位和32位Unicode轉換格式的明確表示,並保留wchar_t實現定義。「

+0

該死的..我雖然wchar_t是2個字節:(我怎樣才能使用平臺無關的編碼? – user2399415

+0

@ user2399415編輯建議你不同的類型:如char16_t或char32_t ' – sgun

+0

非常感謝!jamesdlin的帖子也非常有用:-) – user2399415

1

這裏有幾個明顯的問題:

  1. 你不是一個NUL終止符分配空間。

  2. 你假設wchar_t是2個字節,這不一定是真的。在許多Linux系統上,它可能代表一個長度爲4個字節的UTF-32代碼單元。

  3. 你假設你正在使用一個小端架構,這也不一定是真實的(雖然它可能是真的)。

  4. 您打電話格式字符串,但wprintf()預計const wchar_t*參數。編譯器應該已經產生了一個關於這個的錯誤。 (你記得要加#include <wchar.h>(對於C)或#include <cwchar>(對於C++)?)

假設這意味着僅在ASCII投入工作,你可以通過做解決這些問題:

int size = strlen(data) + 1 /* NUL */; 
... 

// Allocate a wchar_t buffer directly. 
// Note that the cast below is necessary in C++ but not in C. 
wchar *temp = (wchar_t *)malloc(size * sizeof *temp); 
... 
int j = 0; 
for(int i = 0; i < size; i++) 
{ 
    temp[j++] = data[i]; 
} 

,然後當你打電話wprintf,使用方法:

wprintf(L"%ls\n", temp); // Note the L prefix to the string literal. 

另外,不要忘記調用free(temp)時,即可大功告成。

+0

typo:'wchar * temp' - >'wchar_t * temp' – dyp

+0

* Ahem *,我試圖將單字節字符轉換爲雙字節字符(我理解'unicode'這樣的關鍵詞。)例如'a'變成'a \ x00',因爲我使用的一些關鍵字長度是兩個字節,不僅僅是ASCII :) – user2399415

+1

@ user2399415:你的原始代碼試圖只填充零字節的字符,這隻適用於ASCII字符。如果您需要處理其他編碼,您將:1.找出您正在處理的哪些*編碼,以及2.編寫一個解碼器(或者最好使用現有的庫)。 – jamesdlin