0

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-不正なバイトシーケンスだと思います)が出力されます。

ここで何が間違っているのでしょうか?

4

1 に答える 1

0

問題は、UTF-8 から ASCII に変換する必要があり、コンバーターを次のように開いたことです。

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

一方、次のようにする必要があります。

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

(引数順)。適切なエラーコードを取得できなかった理由はまだわかりません。

于 2014-04-10T09:24:15.807 に答える