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中可能出現在大型應用程序中的任何特定行爲,但不是一個簡單的情況? 謝謝
如何鏈接問題代碼(靜態或動態)?代碼是在同一臺機器上運行的嗎?代碼是32位還是64位?操作系統是否安裝在32位或64位上運行? – 2012-03-05 02:03:08
失敗的代碼靜態鏈接到應用程序的主庫中,然後動態鏈接到可執行文件。 C運行時間是動態鏈接的。這是使用gcc 4.4在64位Windows機器上針對ARM交叉編譯的所有32位代碼。 – Marcelo 2012-03-05 02:13:52
啊,那麼問題可能是目標機器沒有安裝適當的'iconv'庫和索引。請參閱'/ usr/lib [64]/gconv' – 2012-03-05 02:18:00