Windows で iconv を使用して文字セット変換を実行する必要があります。この場合、これはアクセントなどを削除するための音訳ですが、私が直面している問題は、ほとんどのターゲット エンコーディングで同じです。これが私のプログラムです:
#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;
}
test.txt ファイルは次のようになります (BOM なしの UTF-8)。
qwe
Tøyenbekken
Zażółć gęślą jaźń
ZAŻÓŁĆ GĘŚLĄ JAŹŃ
残念ながら、iconv 呼び出しは、最初の非 ASCII 文字とプログラム出力で処理を停止します。
75 1000
-1 0 69 994
-1 の戻り値はエラーを示しますが、errno が 0 に設定されているため、何が問題なのかわかりません。
ここで何が間違っているのですか?問題をさらに興味深いものにするために、libiconv2.dll ファイルと同じディレクトリにある iconv.exe の出力を示します。
> iconv -f utf-8 -t ascii//translit test.txt
qwe
Toyenbekken
Zaz'ol'c ge'sla ja'z'n
ZAZ'OL'C GE'SLA JA'Z'N
これは大丈夫です。
Linux でのテスト後の更新: コマンド ライン バージョンの iconv が機能しません。コンソールにガベージが出力されます (非 ASCII 文字の代わりに)。私自身のコードを使用すると、ASCII文字を処理した後、エラーコード84(これはEILSEQ-不正なバイトシーケンスだと思います)が出力されます。
ここで何が間違っているのでしょうか?