從 Python 3.6 的 PEP 529 看 Windows APIs

By | February 23, 2017

談談 Python 3.6 中的 PEP 529

Windows 版的 Python 去到 3.6 才改用 UTF-16 APIs,在此之前一直使用 ANSI APIs。

這個要從 Windows 的歷史講起。Windows 9x 系列 (95 – Me),原生並不支援 Unicode (在 2001 年 Microsoft 推出了 Microsoft Layer for Unicode 令 9x 支援 Unicode,但 2001 年已推出了 Windows XP)。在 9x,它是使用 multibyte code page 來支援非 ANSI (英文) 字元。

與此同時,差不多並行推出的 Windows NT 系列 (NT 3.51, NT4, W2K, XP, 7, 8 到現在的 10) 是原生支援 Unicode,而同 POSIX (Linux、Mac、BSD) 不同,Microsoft 是採用 UTF-16,而非 POSIX 使用的 UTF-8。之前有談過,UTF-16 是不兼容 ANSI 的,於是便出現了 2 套 Windows APIs,一套 ANSI 一套 UTF-16,分別以 A 及 W 結尾,如 CreateDirectoryA 及 CreateDirectoryW。而 macro 則根據有沒有 define UNICODE 而決定 CreateDirectory 是指向 A 還是 W 的 API。

這段歷史,一正困擾著 Windows C/C++ APIs。現在 Windows 新的 API 只有 W 版本,且越來越多 program 全面轉用 W APIs,看來 A APIs 終於落幕了。