舉例來說我們在 String Table 裡面建一筆資料 ID 為 STRING_ID_SEASON_AND_TEMPERATURE 而中文及英文的值各是以下的格式
繁中:%s的%s平均 %d 度
英文:It's %d degrees in %s in %s
如果我們是用 CString 的 Formate 來填上三個值,會發現中、英文的 %d 位置不一樣,如果沒有針對這點做處理,會導致將 String 配對到 %d 的位置時發生 Crash 例如
CString strDesc;
strDesc.Format(STRING_ID_SEASON_AND_TEMPERATURE, strCountry, strSeason, nTemperature);
// 繁中輸出:台灣的夏天平均 30 度
// 英文環境下因為把 strCountry 指給 %d 而 Crash
而 CString 的 FormatMessage 就是用來讓我們自訂順序的一個函式,指定順序的簡單範例如下
繁中:%1!s!的%2!s!平均 %3!d! 度
英文:It's %3!d! degrees in %1!s! in %2!s
接著比照使用 Format 時一樣的方式將參數排上去就可以了,FormatMessage 會幫我們解決哪個位置該對應哪一個順序的參數問題,例如
CString strDesc;
strDesc.Format(STRING_ID_SEASON_AND_TEMPERATURE, strCountry, strSeason, nTemperature);
// 繁中輸出:台灣的夏天平均 30 度
// 英文輸出:It's 30 degrees in taiwan in summer
參考 MSDN 的資料:CString::FormatMessage
此外可以看到上面的範例中有 %s 及 %d,這在某些情況下可能也會碰到一些問題,假設某些資料在中文習慣用名詞來表達,在其他語系國家習慣用數字表達,所以通常輸出的訊息建議一律是吃字串參數,也就是字串表中只會有 %s 存在,這樣子就不會碰到形別的問題了。
沒有留言:
張貼留言