翻译《The Old New Thing》 - What is the deal with the ES_OEMCONVERT flag?

发布于:2024-05-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

What is the deal with the ES_OEMCONVERT flag? - The Old New Thingicon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20050719-12/?p=34893

Raymond Chen 在 2005年07月19日


 ES_OEMCONVERT 标志是怎么回事?

简要

文章讨论了 ES_OEMCONVERT 编辑控件风格的起源和用途,以及为什么在现代 Windows 系统中它不再必要。

正文

   ES_OEMCONVERT 编辑控件风格是 16 位 Windows 系统的遗留物。这篇古老的 MSDN 文章来自 Windows 3.1 SDK,它这样描述这个标志:

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 的用户将不允许输入中文字符作为文件名,尽管文件系统完全能够创建包含这些字符的文件名。