0
我需要在Windows上使用iconv執行字符集轉換。在這種情況下,這是音譯去除口音等,但我面臨的問題是大多數任何目標編碼相同。這是我的計劃:在Windows/Linux上的libiconv問題
#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返回值指示錯誤,但錯誤號被設置爲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 - 非法字節序列)。
任何想法可能是錯誤的嗎?