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 문자 처리 후.
어떤 아이디어가 잘못 되었습니까?