2011-11-23 6 views
2

문자열을 GBK 문자 세트에서 ISO-8859-1로 변환하려고합니다.iconv를 사용하여 C/C++에서 문자열을 ISO-8859-1로 변환

난의 iconv 라이브러리를 사용하는 것을 시도했다, 그러나 iconv()는 항상 -1을 반환하고, errno"잘못된 또는 불완전한 멀티 바이트 또는 넓은 문자"로 디코딩합니다.

어떻게하면됩니까?

+2

당신이 재현 10-20 줄 프로그램을 게시 할 수 이 문제? – sarnold

+0

해당 문자열에 비 ASCII (예 : 중국어) 문자가 포함되어 있습니까? 그것이 변환 루틴이 변환하지 못하는 이유가 될 수 있습니다. –

+0

예, 문자열에 비 ASCII 문자가 포함되어 있습니다. – maixl

답변

2

//TRANSLIT 또는 //IGNORE없이 변환 설명자를 연 경우 iconv()은 대상 문자 집합에서 입력 문자를 나타낼 수 없을 때 오류를 반환합니다. ISO-8859-1은 대부분의 GBK 문자를 나타낼 수 없으므로이 상황이 발생할 가능성이 큽니다. 다음 예는 나를 위해 작동 :

#include <stdio.h> 
#include <string.h> 
#include <iconv.h> 

int main() 
{ 
    char *gbk_str = "GBK \xB5\xE7\xCA\xD3\xBB\xFA"; 
    char dest_str[100]; 
    char *out = dest_str; 
    size_t inbytes = strlen(gbk_str); 
    size_t outbytes = sizeof dest_str; 
    iconv_t conv = iconv_open("ISO-8859-1//TRANSLIT", "GBK"); 

    if (conv == (iconv_t)-1) { 
     perror("iconv_open"); 
     return 1; 
    } 

    if (iconv(conv, &gbk_str, &inbytes, &out, &outbytes) == (size_t)-1) { 
     perror("iconv"); 
     return 1; 
    } 

    dest_str[sizeof dest_str - outbytes] = 0; 
    puts(dest_str); 

    return 0; 
} 

(나는 GBK 문자열이 음란하지 희망, 나는 그것이 무엇을 의미하는지 전혀 모른다!)

+0

예제를 컴파일하고 // TRANSLIT로 변환 설명자를 열어도 여전히 실패합니다. // IGNORE를 사용하여 변환 설명자를 열면 성공을 변환 할 수 있지만 비 ASCII 문자는 무시합니다. – maixl

+0

@maixl : 어떤 'iconv' 구현을 사용하고 있습니까? – caf