控制台应用程序问题
8 位控制台函数使用 OEM 代码页。 所有其他函数默认使用 ANSI 代码页。 这意味着控制台函数返回的字符串可能无法由其他函数正确处理,反之亦然。 例如,如果 FindFirstFileA 返回包含某些扩展 ANSI 字符的字符串,WriteConsoleA 将不会正确显示该字符串。
控制台应用程序的最佳长期解决方案是使用 Unicode。 在为 UTF-8 代码页的 65001
(CP_UTF8
常量)使用 SetConsoleCP 和 SetConsoleOutputCP 之后,控制台将接受 API 的 W 变体上的 UTF-16 编码或 API 的 A 变体上的 UTF-8 编码。
如果不使用该解决方案,控制台应用程序应使用 SetFileApisToOEM 函数。 该函数更改相关的文件函数,以便生成 OEM 字符集字符串,而不是 ANSI 字符集字符串。
以下是文件函数:
CopyFile
CreateDirectory
CreateFile
CreateProcess
DeleteFile
FindFirstFile
FindNextFile
GetCurrentDirectory
GetDiskFreeSpace
GetDriveType
处理命令行时,控制台应用程序应使用相关的“字符转 OEM”函数,获取 Unicode 形式的命令行并将其转换为 OEM 形式。 另请注意,argv 使用 ANSI 字符集。