2014-03-28 143 views
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 - 非法字節序列)。

任何想法可能是錯誤的嗎?

回答

0

的問題是,我想從UTF-8轉換爲ASCII並開通了轉換器是這樣的:

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

,而它應該做的事是這樣的:

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

(參數順序)。仍然不知道爲什麼我沒有得到正確的錯誤代碼。