都是因为万恶的兼容性。

Windows 内核中默认使用的是 UTF-16,如果你写内核驱动就知道了,在内核里几乎都是以 UTF-16 的方式处理字符串的。

对于运行在应用层(用户态)的代码,Windows 允许用户通过配置确定非 Unicode 字符的显示方式,可以是中文,也可以是 BIG5,也可以是其它字符集。

为什么这么设计?因为是考虑到兼容性的问题,现在 Windows7 里,仍然能运行大量 Windows 98 时代的程序,WindowsXP 里甚至能运行不少 Windows3.x 甚至更古老的程序,原因就是为了兼容性。

题主喜欢 UTF-8,应该从 Linux 开发转过来的吧?Linux 默认我记得是 UTF-8(好像 JSP 也是?),UTF-8 和 UTF-16 哪个更好我就不细说了,这方面的争论至今都没有结果。但是 Windows 可以把应用设置成 UTF-16,之后的开发几乎没有太多的改变,我也没遇到过“这不仅导致开发程序复杂”的情况,至少 C 语言开发是这样的。所以,我看不出来 UTF-16 带来多少开发程序的不便。

为什么用 UTF-16?好像 UTF-16 出现的比 UTF-8 要早一些,微软内核选择了 UTF-16,再大改内核是非常困难的,大概是这样的。

如果题主是想讨论 UTF-8 和 UTF-16 哪个更好,建议再开个题目。

补充,反对

@赵冬毓

的回答,国家标准中只强调支持,而没有强调必须默认使用,“must conform”是“要求符合”,而没有强调默认使用(default)这个字符集,工信部的那个规范里也没有强调默认使用这一点。

遵循国家标准,也可以是把国家标准作为操作系统的子集,因为 Linux、MacOS 均支持 GB18030,并且这个默认支持的行为不需要每次开机都提示,只需要在安装时告之即可。而且微软也做过类似的事情:在欧洲销售的 WindowsXP 在安装的时候都有浏览器的选择,并提供了 Firefox 等其它浏览器的下载链接,这也是微软为了提供告之义务以规避当地的反垄断法规。而且微软即使保持对 GB18030 默认支持,对于兼容性来说也没有问题,既遵守法律,又保持兼容性,未尝不可。

另外,附上标准全文:

信息处理产品中文要求认证实施规则

以及维基百科上的说明:

GB 18030

以及检测标准:

检测一般要求如下:

  ●字汇完整性:产品的字汇范围应是国家标准 GB 18030 中所有给出字形的字符;

  ●体系正确性:产品必须能够正确识别和处理按照国家标准 GB 18030 进行编码的文本文件。