Winapi 记事本在显示ANSI文件之前是否将其转换为Unicode?

Winapi 记事本在显示ANSI文件之前是否将其转换为Unicode?,winapi,unicode,ansi,notepad,Winapi,Unicode,Ansi,Notepad,如果记事本编辑控件是Unicode,那么当加载ANSI文件时,记事本是否首先将其内容转换为Unicode然后显示它,或者记事本是否有两个内存缓冲区(一个用于ANSI,一个用于Unicode)?是,记事本会进行转换,这从它调用IsTextUnicode()的事实可以看出要在没有BOM的情况下发现文本编码,并因此遭受臭名昭著的错误,Raymond Chen的博客上讨论了这一问题: Win32SetWindowText函数将提供的字符串转换为窗口所需的字符集。所以,可能是Windows本身而不是记事

如果记事本编辑控件是Unicode,那么当加载ANSI文件时,记事本是否首先将其内容转换为Unicode然后显示它,或者记事本是否有两个内存缓冲区(一个用于ANSI,一个用于Unicode)?

是,记事本会进行转换,这从它调用
IsTextUnicode()的事实可以看出
要在没有BOM的情况下发现文本编码,并因此遭受臭名昭著的错误,Raymond Chen的博客上讨论了这一问题:


Win32
SetWindowText
函数将提供的字符串转换为窗口所需的字符集。所以,可能是Windows本身而不是记事本在进行转换。所以我可以假设,当记事本加载ANSI文件时,它调用SetWindowTextA(),当加载Unicode文件时,它调用SetWindowTextW()?不,我没有这么说,因为我没有检查它的源代码。但这将是最容易做到的。Unicode“编辑”控件有一个Unicode文本缓冲区(仅限)。这有什么关系?可访问性接口以任何方式返回Unicode。我不确定这能证明什么。我们已经知道记事本同时处理单字节和Unicode文本文件。并且仍然不知道转换发生在哪里——在notepad.exe中(不太可能),在notepad.exe直接调用的WinAPI函数中,或者在间接调用的WinAPI函数中,因为notepad使用另一个调用转换函数的组件。如果notepad使用Unicode编辑控件,它只能处理UTF-16。如果源文件尚未为UTF-16,则记事本必须先转换为UTF-16,然后才能填充编辑控件。如果没有BOM表,它将使用
istextanicode()
确定文本是ANSI还是UTF-16。当
istextanicode()
错误诊断时,记事本会显示ANSI文本,就像它是UTF-16一样,从而导致“Bush”错误。记事本是否使用
SetWindowTextA()
允许Windows进行转换、使用MultiByteToWideChar()手动转换或使用第三方库都无关紧要。最终结果是相同的。记事本不为ANSI文本创建ANSI编辑控件,为UTF-16文本创建Unicode编辑控件。那太过分了。现在Windows中的一切都是UTF-16。