2014-03-28 4 views
0

Windows에서 iconv를 사용하여 문자 집합 변환을 수행해야합니다. 이 경우 악센트 등을 제거하기위한 음역입니다. 그러나 내가 직면 한 문제는 대부분의 모든 대상 인코딩에서 동일합니다. 여기 내 프로그램은 다음과 같습니다Windows/Linux에서 libiconv 문제

있는 test.txt 파일 (UTF-8w BOM/O를) 다음과 같습니다
#include "stdafx.h" 
#include <vector> 
#include <fstream> 
#include <iconv.h> 
#include <iostream> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::ifstream ifs("test.txt", std::ios::binary | std::ios::ate); 
    std::ifstream::pos_type pos = ifs.tellg(); 
    char * pIn = new char[(int)pos + 1]; 
    ifs.seekg(0, std::ios::beg); 
    ifs.read(pIn, pos); 
    pIn[pos] = 0; 
    size_t srclen = strlen(pIn); 

    char dst[1000]; 
    char * pOut = (char*)dst; 
    size_t dstlen = 1000; 

    iconv_t conv = iconv_open("UTF-8", "ASCII//TRANSLIT"); 
    std::cout << srclen << " " << dstlen << std::endl; 
    auto ret = iconv(conv, (const char**)&pIn, &srclen, &pOut, &dstlen); 
    std::cout << (int)ret << " " << errno << " " << srclen << " " << dstlen << std::endl; 
    iconv_close(conv); 

    return 0; 
} 

:

qwe 
Tøyenbekken 
Zażółć gęślą jaźń 
ZAŻÓŁĆ GĘŚLĄ JAŹŃ 

불행히도의 iconv 호출이 최초의 비 ASCII 문자에서 처리를 중지하고 프로그램 출력 :

75 1000 
-1 0 69 994 

-1 반환 값은 에러를 나타내지 만 errno는 잘못 될 것인가에 대한 어떠한 단서 없음 0으로 설정된다.

여기 내가 뭘 잘못 생각하고 있니? 이 문제를 더 재미있게 만들려면 libiconv2.dll 파일과 같은 dir에있는 iconv.exe의 출력을 사용하십시오.

괜찮 았습니다.

Linux에서 테스트 한 후 업데이트 : iconv의 명령 줄 버전이 작동하지 않습니다. (아스키가 아닌 문자 대신) 콘솔에 가비지를 출력합니다. 내 자신의 코드를 사용하여 84 오류 코드를 출력합니다 (나는 EILSEQ - 불법 바이트 시퀀스를 추측합니다) ascii 문자 처리 후.

어떤 아이디어가 잘못 되었습니까?

답변

0

문제는 내가 ASCII로 UTF-8로 변환 싶다고했고 컨버터 이런 식으로 열 :

iconv_t conv = iconv_open("UTF-8", "ASCII//TRANSLIT"); 

는이 방법으로 수행해야하는 반면 :

iconv_t conv = iconv_open("ASCII//TRANSLIT", "UTF-8"); 

(인수 순서를). 왜 내가 적절한 오류 코드를 얻지 못했는지 아직도 확실하지 않습니다.