簡體   English   中英

MFC CEdit 將非 ascii 字符轉換為 ascii

[英]MFC CEdit converts non-ascii characters to ascii

我們有一個 MFC Windows 應用程序,最初是用 VC++ 6 編寫的,多年來針對更新的 IDE 進行了更新,目前在 VS2017 中開發。

該應用程序是用 MBCS(不是 unicode)構建的。 嘗試切換到 Unicode 會導致 3806 編譯錯誤,這可能只是冰山一角。

但是,我們希望能夠使用不同的代碼頁運行應用程序,即。 1250(中歐)。

我嘗試構建一個小型測試應用程序,並設法讓它與特殊字符 (čćšđž) 一起工作。 我通過使用代碼頁 1250 將對話框字體設置為 Microsoft Sans Serif 來做到這一點。我們的應用程序中的相同方法不起作用。 注意:我們應用程序中的對話框是動態創建的,字體是使用 SetFont 設置的。

在這兩個應用程序中處理特殊字符的方式有所不同。

  • 在測試應用程序中,特殊字符顯示在編輯控件中,GetWindowsText 檢索正確的字節。 但是,嘗試從其他語言編寫一些字符時,會將它們呈現為“????”。
  • 在我們的應用程序中,所有特殊字符都被正確渲染,但 GetWindowText(或 WM_GETTEXT)將特殊字符轉換為類似的 ascii 對應物(čćđ -> ccd)。

我相信我們應用程序中的 Edit 控件顯示 Unicode 文本,但 GetWindowText 將其轉換為 ascii。

有誰知道這里發生了什么,以及我該如何解決?

注意:我知道如何將項目轉換為 Unicode。 我們目前選擇不為此投入資源,因為它可能需要數周或數月才能實施。 問題是我如何讓它與 MBSC 一起工作,以及為什么編輯控件將 Č 轉換為 C。

我相信絕對有可能將應用程序移植到其他語言/代碼頁,您只需要修改.rc(資源)文件,基本上每種語言都有一個資源文件,無論如何您都希望這樣做,例如字符串菜單和/或字符串表將使用其他語言。 就應用程序部分而言,這實際上是唯一需要的更改。

另一部分是您正在其上運行的系統。 窗口可以是unicode或非unicode。 您可以使用Spyxx實用程序看到此信息,它告訴您窗口(過程)是否為unicode(“窗口屬性”,“常規”選項卡)。 盡管unicode窗口可以正常工作,但非unicode窗口必須在獲取或設置文本時將編碼更改為unicode和mbcs。 轉換基於系統(默認)代碼頁 只能全局設置(針對整個計算機),而不能按每個應用程序或窗口設置。 當然,僅設置字體的代碼頁是不夠的(如果您在使用“正確”代碼頁的計算機上運行應用程序,則根本不需要imo)。 也就是說,對於非Unicode應用程序,只有一個代碼頁可以正常工作,而其他代碼頁則無法正常工作。

我可以看到兩個選項:

  • 如果您只需要更新少量控件,則可以僅將這些控件更改為unicode,並使用“獲取/設置”窗口測試功能或消息的“寬”版本-您將必須轉換文本在unicode和所需的代碼頁之間。 它需要編寫一些代碼,但具有轉換獨立於系統默認代碼頁的優點,例如,您可以將代碼頁保存在某些配置文件中,注冊表中或作為命令行選項(在應用程序的快捷方式中)。 某些控件類型可以更改為unicode,而另一些則不能,因此請檢查文檔。 這項技術成功地用於mbcs應用程序,它以多種不同的語言顯示/編輯翻譯后的字符串,但是我只有一個控件,即List-View,btw提供LVM_SETUNICODEFORMAT消息,因此即使在mbcs應用程序中也可以使用unicode文本。
  • 最簡單的方法是直接按原樣運行應用程序,但它只能在具有適當默認代碼頁的計算機上工作,就像大多數非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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM