gpt4 book ai didi

linux - libiconv 在 windows/linux 上的问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:51 25 4
gpt4 key购买 nike

我需要在 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 w/o 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 - 非法字节序列)。

你知道这里可能有什么问题吗?

最佳答案

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

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

而应该这样做:

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

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

关于linux - libiconv 在 windows/linux 上的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22708605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com