[英]MFC CEdit converts non-ascii characters to ascii
我們有一個 MFC Windows 應用程序,最初是用 VC++ 6 編寫的,多年來針對更新的 IDE 進行了更新,目前在 VS2017 中開發。
該應用程序是用 MBCS(不是 unicode)構建的。 嘗試切換到 Unicode 會導致 3806 編譯錯誤,這可能只是冰山一角。
但是,我們希望能夠使用不同的代碼頁運行應用程序,即。 1250(中歐)。
我嘗試構建一個小型測試應用程序,並設法讓它與特殊字符 (čćšđž) 一起工作。 我通過使用代碼頁 1250 將對話框字體設置為 Microsoft Sans Serif 來做到這一點。我們的應用程序中的相同方法不起作用。 注意:我們應用程序中的對話框是動態創建的,字體是使用 SetFont 設置的。
在這兩個應用程序中處理特殊字符的方式有所不同。
我相信我們應用程序中的 Edit 控件顯示 Unicode 文本,但 GetWindowText 將其轉換為 ascii。
有誰知道這里發生了什么,以及我該如何解決?
注意:我知道如何將項目轉換為 Unicode。 我們目前選擇不為此投入資源,因為它可能需要數周或數月才能實施。 問題是我如何讓它與 MBSC 一起工作,以及為什么編輯控件將 Č 轉換為 C。
我相信絕對有可能將應用程序移植到其他語言/代碼頁,您只需要修改.rc(資源)文件,基本上每種語言都有一個資源文件,無論如何您都希望這樣做,例如字符串菜單和/或字符串表將使用其他語言。 就應用程序部分而言,這實際上是唯一需要的更改。
另一部分是您正在其上運行的系統。 窗口可以是unicode或非unicode。 您可以使用Spyxx實用程序看到此信息,它告訴您窗口(過程)是否為unicode(“窗口屬性”,“常規”選項卡)。 盡管unicode窗口可以正常工作,但非unicode窗口必須在獲取或設置文本時將編碼更改為unicode和mbcs。 轉換基於系統(默認)代碼頁 。 只能全局設置(針對整個計算機),而不能按每個應用程序或窗口設置。 當然,僅設置字體的代碼頁是不夠的(如果您在使用“正確”代碼頁的計算機上運行應用程序,則根本不需要imo)。 也就是說,對於非Unicode應用程序,只有一個代碼頁可以正常工作,而其他代碼頁則無法正常工作。
我可以看到兩個選項:
LVM_SETUNICODEFORMAT
消息,因此即使在mbcs應用程序中也可以使用unicode文本。 可以通過設置區域設置“管理”選項卡中的“非Unicode程序的語言”選項來更改系統默認代碼頁,並且需要重新啟動。 更改Windows UI語言也會更改此選項,但是通過設置此選項,您無需更改UI語言,例如,您可以擁有英文UI和東歐代碼頁。
在這里看到非常相似的帖子。
晚會遲到:
在我們的應用程序中,所有特殊字符都被正確渲染,但 GetWindowText(或 WM_GETTEXT)將特殊字符轉換為類似的 ascii 對應物(čćđ -> ccd)。
這聽起來像是為控件設置了ES_OEMCONVERT標志:
轉換在編輯控件中輸入的文本。 文本從 Windows 字符集轉換為 OEM 字符集,然后再轉換回 Windows 字符集。 當應用程序調用 CharToOem 函數將編輯控件中的 Windows 字符串轉換為 OEM 字符時,這可確保正確的字符轉換。 此樣式對於包含將在不支持 Unicode 的文件系統上使用的文件名的編輯控件最有用。
若要在創建控件后更改此樣式,請使用 SetWindowLong。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.