2012-03-05 193 views
2

在將大型應用程序從Windows移植到Linux時,我需要能夠在寬字符和多字節字符之間進行轉換。爲此,我的代碼如下所示:Linux中奇怪的iconv_open行爲

void IConv(const InType* begin, const InType* end, const char* inCode, OutType* outBegin, OutType*& outEnd, const char* outCode) 
{ 
    assert(end >= begin); 
    assert(outEnd > outBegin); 

    iconv_t cd = iconv_open(outCode, inCode); 
    if (cd == reinterpret_cast<iconv_t>(-1)) 
     throw (InvalidLocale()); 
/* blah, blah, blah other code we never reach */ 
} 

該代碼始終引發異常。爲了調試這個,我創建了一個更簡單的版本,它使用與失敗代碼相同的參數。這是我的測試代碼

int main(void) 
{ 

    const char outCode[] = ""; 
    const char inCode[] = "wchar_t"; 

    //Using wchar_t and "" means that iconv will just use the system locale settings. 
    iconv_t cd = iconv_open(outCode, inCode); 
    if (cd == reinterpret_cast<iconv_t>(-1)) 
    { 
     printf("iconv failed to use outCode %s and inCode %s\n",outCode, inCode); 
     return 1; 
    } 

    iconv_close(cd); 
    return 0; 
} 

請注意,代碼幾乎相同。但在我的測試代碼中,我從來沒有看到失敗,而IConv函數總是失敗。系統上的語言環境是通過LANG env變量設置的,在這種情況下始終是ISO-8859-1。

所以,問題是,有沒有人知道iconv中可能出現在大型應用程序中的任何特定行爲,但不是一個簡單的情況? 謝謝

+0

如何鏈接問題代碼(靜態或動態)?代碼是在同一臺機器上運行的嗎?代碼是32位還是64位?操作系統是否安裝在32位或64位上運行? – 2012-03-05 02:03:08

+0

失敗的代碼靜態鏈接到應用程序的主庫中,然後動態鏈接到可執行文件。 C運行時間是動態鏈接的。這是使用gcc 4.4在64位Windows機器上針對ARM交叉編譯的所有32位代碼。 – Marcelo 2012-03-05 02:13:52

+1

啊,那麼問題可能是目標機器沒有安裝適當的'iconv'庫和索引。請參閱'/ usr/lib [64]/gconv' – 2012-03-05 02:18:00

回答

2

問題是目標機器可能沒有安裝適當的iconv庫和索引。見/usr/lib[64]/gconv。共享庫通常是glibc安裝的一部分。諸如localedef之類的工具可以創建它們。