ES_OEMCONVERT 这个标志,主要是用在 16 位 Windows 系统上。下面是一篇 MSDN 上的文章中对它的一段描述:
ES_OEMCONVERT 会导致输入到编辑控件中的文本从 ANSI 转换为 OEM,然后再转换回 ANSI。这可确保在应用程序调用 AnsiToOem 函数将编辑控件中的 Windows 字符串转换为 OEM 字符时正确转换字符。ES_OEMCONVERT 对于包含文件名的编辑控件最有用。
让我们将时间返回到1992年1月31日,即上面这篇文章的日期。
此时,主要的 Windows 平台是Windows 3.0。Windows 3.1距离发布还有几个月的时间,而 Windows NT 3.1 还有一年多的时间。主要的文件系统是 16 位 FAT,为了讨论的目的,这个时代的 FAT 的相关功能是文件名以 OEM 字符集存储在磁盘上。(我们在前面的文章中讨论了 OEM 和 ANSI 代码页之间分裂背后的历史。
由于 GUI 程序使用 ANSI 字符集,但文件名存储在 OEM 字符集中,因此 GUI 程序中文件名中唯一可以使用的字符是两个字符集中存在的字符。如果 ANSI 字符集中存在某个字符,但 OEM 字符集中不存在,则无法将其用作文件名;如果 OEM 字符集中存在某个字符,但不存在 ANSI 字符集,则 GUI 程序无法操作它。
编辑控件上的 ES_OEMCONVERT 标志可确保仅使用 ANSI 和 OEM 字符集中存在的字符,因此备注 “ES_OEMCONVERT” 对于包含文件名的编辑控件最有用”。
让我们快进到今天。
所有流行的 Windows 文件系统都支持 Unicode 文件名,并且已经有十年的历史了。从 ANSI 字符集转换为文件系统使用的字符集不再有数据丢失。因此,无需筛选出任何字符来防止用户键入在转换为文件名期间将丢失的字符。换句话说,ES_OEMCONVERT 这个标志在今天毫无意义。这是 Unicode 标准出来之前的产物。
事实上,如果你使用这个标志,你会让你的程序变得更糟,而不是更好,因为它不必要地限制了允许用户在文件名中使用的字符集。例如,运行美国英语版本的 Windows 的用户不允许输入中文字符作为文件名,即使文件系统完全能够创建名称包含这些字符的文件。
总结
今天文章的意义,不在于如何使用 ES_OEMCONVERT ,而是,在你吭哧吭哧编写界面代码的时候,如果看到了这个标志,你不至于一点感觉都没有。
现在你的状态应该是:ES_OEMCONVERT 对我的程序没有任何有用或者有害的影响,我不需要使用它。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What is the deal with the ES_OEMCONVERT flag?》