关于windows / linux问题的libiconv

时间:2014-03-28 09:21:05

标签: linux windows character-encoding iconv libiconv

我需要在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文件如下所示(UTF-8没有BOM):

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

不幸的是,iconv调用在第一个非ASCII字符和程序输出处停止处理:

75 1000
-1 0 69 994

返回值-1表示错误,但是errno设置为0,这没有给出可能出错的线索。

知道我在这里做错了什么吗?为了使这个问题更有趣,iconv.exe的输出位于与libiconv2.dll文件相同的目录中:

> 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 - 非法字节序列)。

这里有什么想法可能有什么问题?

1 个答案:

答案 0 :(得分:0)

问题是我想从UTF-8转换为ASCII并以这种方式打开转换器:

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

应该这样做:

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

(参数顺序)。仍然不确定为什么我没有得到正确的错误代码。