2017-02-24 2 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 

당신은 경우 0으로 코드의 두 가지 유형을 complie 수 있습니다 ->의 경우 1

와 나는 한 방법 경우에 필요합니다. 자신의 첫 번째 요소에 대한 포인터에

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

당신이 함수에 배열을 전달

, 그들은 붕괴 :

+0

"작동하지 않습니다"라는 말은 문제에 대한 설명이 아닙니다. *** 어떻게 *** 작동하지 않습니다? 그것은 구축되지 않습니까? 달리면 충돌이 발생합니까? 예기치 않은 결과가 있습니까? 정교하게하십시오! 그리고 [좋은 질문을하는 법을 읽어보십시오] (http://stackoverflow.com/help/how-to-ask)에 시간을 할애하십시오. –

+0

@Someprogrammerdude 문제는 예기치 않은 결과입니다. 그리고 나는 그것을 읽으려고 노력한다. 덕분에 – hybang

답변

1

다음은 문제입니다. 귀하의 전화

fn2Utf8(inBuf, outBuf); 

함수에 인수가 배열되지 않음을 의미하지만, 포인터

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

과 같다. 그리고 포인터에 sizeof을하면 포인터의 크기를 얻고 포인터의 크기는 알 수 없습니다.

두 가지 해결책이 있습니다. 첫 번째는 배열의 길이를 함수의 인수로 전달하여이를 사용하는 것입니다. 두 번째는 적어도 inBuf 인수의 경우 null로 끝나는 문자열이고 대신 strlen을 사용한다는 것입니다.

두 번째 방법은 strlen으로 이미 설명한대로 inBuf에서만 작동하지만 첫 번째 방법을 사용하여 크기를 인수로 전달해야하는 outBuf에서 작동하지 않습니다.


만약 기능이없는 프로그램의 작품 다음 에 배열, 그리고 포인터를 sizeof을하고 있기 때문이다. 배열이 있고 포인터가 아닌 경우 sizeof은 배열의 크기를 바이트 단위로 나타냅니다.

+0

고마워요. 나는 첫 번째 방법을 시도하고 대답을 얻었다! fn2Utf8 (inBuf, sizeof (inBuf), outBuf, sizeof (outBuf)) – hybang

관련 문제