2017-02-24 247 views
0

我試圖在Linux中使用iconv()將UTF-16LE轉換爲UTF-8。使用iconv()將UTF-16LE轉換爲UTF-8()

,我想它做..

但我得到了一些麻煩..我的代碼..

,我認爲兩個代碼是一樣的,但是第一個沒有工作。只有第二個工作。

#include "stdio.h" 
#include "string.h" 
#include "iconv.h" 
#include "errno.h" 
#if 1 
int fn2Utf8(char inBuf[], char outBuf[]) { 
    size_t readBytes = sizeof(inBuf); 
    size_t writeBytes = sizeof(outBuf); 
    char* in = inBuf; 
    char* out = outBuf; 

    iconv_t convert = iconv_open("UTF-8","UTF-16LE"); 
    if (iconv(convert, &in, &readBytes, &out, &writeBytes) < 0) { 
     return (-1); 
    } 
    iconv_close(convert); 
    printf("[%s] [%s]\n", inBuf, outBuf); 
    return (out - outBuf); 
} 
int main() { 
    char inBuf[128] ="\x5c\x00\xbd\xac\x01\xc6\x00\xd3\x5c\x00\x00\xb3\x78\xc6\x44\xbe\x5c\x00\x2a\x00\x00\x00"; 
    char outBuf[128]; 
    fn2Utf8(inBuf, outBuf); 
    return 0; 
} 
#else 
int main() { 
    char inBuf[128] = "\x5c\x00\xbd\xac\x01\xc6\x00\xd3\x5c\x00\x00\xb3\x78\xc6\x44\xbe\x5c\x00\x2a\x00\x00\x00"; 
    char outBuf[128]; 
    size_t readBytes = sizeof(inBuf); 
    size_t writeBytes = sizeof(outBuf); 
    char* in = inBuf; 
    char* out = outBuf; 

    iconv_t convert = iconv_open("UTF-8","UTF-16LE"); 
    if (iconv(convert, &in, &readBytes, &out, &writeBytes) < 0) { 
    return (-1); 
    } 
    iconv_close(convert); 
    printf("[%s] [%s]\n", inBuf, outBuf); 
    return 0; 
} 
#endif 

可以complie 2種類型的代碼與如果0 - >如果1

,我需要如果1種方法。

+0

只是說「它不工作」並不是一個很好的問題描述。 ***如何***不起作用?它不是建立?跑步時你會碰撞嗎?意外的結果?請詳細說明!請花一些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+0

@Someprogrammerdude這個問題是意想不到的結果。我嘗試閱讀。謝謝 – hybang

回答

1

這裏的問題:

size_t readBytes = sizeof(inBuf); 
size_t writeBytes = sizeof(outBuf); 

當您通過陣列的功能,他們衰減訪問指向他們的第一個元素。您的通話

fn2Utf8(inBuf, outBuf); 

等於

fn2Utf8(&inBuf[0], &outBuf[0]); 

這意味着,在函數的參數不是數組,但指針。當你在指針上做sizeof時,你會得到指針的大小,而不是它指向的內容。

有兩種解決方案:第一種是將數組長度作爲參數傳遞給函數,然後使用它。第二,至少對於inBuf參數,將依賴於它是一個以空字符結尾的字符串,並使用strlen來代替。

第二種方式,strlen僅適用於inBuf,正如我已經說過的,但不適用於outBuf,您必須使用第一種方法並將大小作爲參數傳遞。


如果程序作品,未經功能,因爲你是在做sizeof陣列,而不是一個指針。當你有一個數組而不是指針時,sizeof會給你數組的字節大小。

+0

非常感謝。 我嘗試第一種方法,並得到答案! fn2Utf8(inBuf,sizeof(inBuf),outBuf,sizeof(outBuf)) – hybang