2009-06-29 71 views
3

所以我想使用SetThreadLocale將線程代碼頁設置爲UTF8。到目前爲止,我一直在使用atl字符串轉換宏的第二個參數,如「CT2A(szBUF,CP_UTF8)」來做到這一點。但我希望能夠使用SetThreadLocale()一次性地設置線程代碼頁,而不必再次使用轉換宏的第二個參數。SetThreadLocale和UTF8

我該怎麼做? SetThreadLocale不會像CP_UTF8那樣採用代碼頁參數,只是一個LCID。我應該給SetThreadLocale提供什麼參數來實現這個?

請記住,我沒有考慮到特定的語言。我得到的字符串可能是日文,韓文,英文等等。到目前爲止,在將CP_UTF8指定爲轉換宏的第二個參數時,我對這種字符串組合沒有任何問題。你可能會問「爲什麼不繼續使用第二個參數」。答案「,因爲它可以很容易被代碼工作的團隊成員遺忘,如果它能夠正確使用轉換宏的默認1參數版本,那將是非常好的。」

回答

5

SetThreadLocale需要一個語言標識符,但UTF-8不是一種語言標識符 - 它是一種Unicode編碼。土地ID的目的之一是告訴系統如何處理128-255範圍內的ANSI文本。給定一個真正的語言,它的代碼頁將用於處理這些字符。 UTF-8,OTOH是Unicode文本的壓縮表示。爲了創建UTF-8文本,您的輸入必須是Unicode。鑑於ANSI文本,你只是不知道如何轉換字符的上限。這是完成「手動」操作的方式,爲了將ANSI轉換爲UTF-8,您必須首先使用帶指定代碼頁的MultiByteToWideChar,然後才能將生成的Unicode字符串轉換爲UTF-8。

現在,回到你的問題 - 我會以另一種方式。如果額外的代碼頁參數錯誤的話,請製作一個隱藏它的宏(或繼承CT2A類,並修復第二個參數)。

+0

這個解釋很有道理,謝謝。是的,我想我只是要使用第二個參數。似乎並不是爲線程設置代碼頁的簡單方法。 – 2009-06-30 14:31:21