首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows/linux问题上的libiconv

windows/linux问题上的libiconv
EN

Stack Overflow用户
提问于 2014-03-28 09:21:04
回答 1查看 759关注 0票数 0

我需要在windows上执行字符集转换。在这种情况下,这是音译,以删除重音等,但我面临的问题是相同的,对大多数目标编码。这是我的节目:

代码语言:javascript
复制
#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-8w/o):

代码语言:javascript
复制
qwe
Tøyenbekken
Zażółć gęślą jaźń
ZAŻÓŁĆ GĘŚLĄ JAŹŃ

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

代码语言:javascript
复制
75 1000
-1 0 69 994

返回值-1表示错误,但errno设置为0,这不知道哪里可能出错。

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

代码语言:javascript
复制
> 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 -非法字节序列)。

有什么不对的地方吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 09:24:15

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

代码语言:javascript
复制
iconv_t conv = iconv_open("UTF-8", "ASCII//TRANSLIT");

然而,应该这样做:

代码语言:javascript
复制
iconv_t conv = iconv_open("ASCII//TRANSLIT", "UTF-8");

(辩论次序)。仍然不知道为什么我没有得到正确的错误代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22708605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档