2012-06-29 61 views
0

以下程序在HPUX上返回不正確的值{-1,0,-1},而如果我在Linux上運行相同的程序,它對於區域設置「de_DE.iso885915 @歐元」。 HPUX wcwidth,iswprint和wcswidth是否有問題?HPUX上的wcwidth問題:HPUX上的國際化和本地化問題

int main() 
{ 
    wchar_t str[2]; 
    wchar_t ch = 8364; /* Euro sign */ 

    str[0] = ch; 
    str[1] = '\0'; 

    /* Locale set to [email protected] before running this program */ 
    setlocale(LC_ALL, ""); 

    printf ("%d\n", wcwidth(ch)); 
    printf ("%d\n", iswprint(ch)); 
    printf ("%d\n", wcswidth(str, 2)); 

    return 0; 
} 

回答

1

這有可能是HPUX不使用Unicode作爲編碼wchar_t而是簡單地使用8位的區域設置當存儲在32位wchar_t 8位char值。這是一種醜陋的老式慣例,現在通常會被忽略,但它在C標準中是合法的,事實上C標準允許並鼓勵實現提供預定義宏__STDC_ISO_10646__來指示wchar_t值是Unicode。如果您嘗試切換到基於UTF-8的語言環境並且問題消失,這幾乎肯定是您遇到的問題。

+0

只有在de_DE.iso885915和ko_kr.iso885915上纔會遇到問題,它適用於UTF-8和EUC等其他語言環境。事實上,[email protected]也可以正常工作。奇怪的問題是,現在惠普有補丁嗎? –

+0

可能不是;這不是一個錯誤,而是一個允許的行爲,所以最糟糕的是它只是一個「實施質量」問題。無論如何,這是2012年。您不應該使用非UTF-8語言環境。如果您有遺留數據,請用'iconv'處理。 –

+0

iconv?是否有可能使用iconv獲得字符的顯示寬度,我只是將其用於轉換目的?有沒有其他方法可以讓我們想到寬字符的顯示寬度而不是wcwidth? –