研究研究 ES_OEMCONVERT 標(biāo)志,你學(xué)會(huì)了嗎?
ES_OEMCONVERT 這個(gè)標(biāo)志,主要是用在 16 位 Windows 系統(tǒng)上。下面是一篇 MSDN 上的文章中對(duì)它的一段描述:ES_OEMCONVERT 會(huì)導(dǎo)致輸入到編輯控件中的文本從 ANSI 轉(zhuǎn)換為 OEM,然后再轉(zhuǎn)換回 ANSI。這可確保在應(yīng)用程序調(diào)用 AnsiToOem 函數(shù)將編輯控件中的 Windows 字符串轉(zhuǎn)換為 OEM 字符時(shí)正確轉(zhuǎn)換字符。ES_OEMCONVERT 對(duì)于包含文件名的編輯控件最有用。
讓我們將時(shí)間返回到1992年1月31日,即上面這篇文章的日期。
此時(shí),主要的 Windows 平臺(tái)是Windows 3.0。Windows 3.1距離發(fā)布還有幾個(gè)月的時(shí)間,而 Windows NT 3.1 還有一年多的時(shí)間。主要的文件系統(tǒng)是 16 位 FAT,為了討論的目的,這個(gè)時(shí)代的 FAT 的相關(guān)功能是文件名以 OEM 字符集存儲(chǔ)在磁盤上。(我們?cè)谇懊娴奈恼轮杏懻摿?OEM 和 ANSI 代碼頁(yè)之間分裂背后的歷史。
由于 GUI 程序使用 ANSI 字符集,但文件名存儲(chǔ)在 OEM 字符集中,因此 GUI 程序中文件名中唯一可以使用的字符是兩個(gè)字符集中存在的字符。如果 ANSI 字符集中存在某個(gè)字符,但 OEM 字符集中不存在,則無(wú)法將其用作文件名;如果 OEM 字符集中存在某個(gè)字符,但不存在 ANSI 字符集,則 GUI 程序無(wú)法操作它。
編輯控件上的 ES_OEMCONVERT 標(biāo)志可確保僅使用 ANSI 和 OEM 字符集中存在的字符,因此備注 “ES_OEMCONVERT” 對(duì)于包含文件名的編輯控件最有用”。
讓我們快進(jìn)到今天。
所有流行的 Windows 文件系統(tǒng)都支持 Unicode 文件名,并且已經(jīng)有十年的歷史了。從 ANSI 字符集轉(zhuǎn)換為文件系統(tǒng)使用的字符集不再有數(shù)據(jù)丟失。因此,無(wú)需篩選出任何字符來(lái)防止用戶鍵入在轉(zhuǎn)換為文件名期間將丟失的字符。換句話說(shuō),ES_OEMCONVERT 這個(gè)標(biāo)志在今天毫無(wú)意義。這是 Unicode 標(biāo)準(zhǔn)出來(lái)之前的產(chǎn)物。
事實(shí)上,如果你使用這個(gè)標(biāo)志,你會(huì)讓你的程序變得更糟,而不是更好,因?yàn)樗槐匾叵拗屏嗽试S用戶在文件名中使用的字符集。例如,運(yùn)行美國(guó)英語(yǔ)版本的 Windows 的用戶不允許輸入中文字符作為文件名,即使文件系統(tǒng)完全能夠創(chuàng)建名稱包含這些字符的文件。
總結(jié)
今天文章的意義,不在于如何使用 ES_OEMCONVERT ,而是,在你吭哧吭哧編寫界面代碼的時(shí)候,如果看到了這個(gè)標(biāo)志,你不至于一點(diǎn)感覺(jué)都沒(méi)有。
現(xiàn)在你的狀態(tài)應(yīng)該是:ES_OEMCONVERT 對(duì)我的程序沒(méi)有任何有用或者有害的影響,我不需要使用它。