为什么不允许UTF-8作为“ANSI”代码页?

Windows _setmbcp函数允许任何有效的代码页…

(UTF-7和UTF-8除外,不支持)

OK,不支持UTF-7是有道理的:字符具有非唯一的表示,并且引入了复杂性和安全风险。

但为什么不是UTF-8?

据我所知,Windows API函数的“ANSI”版本将其参数转换为UTF-16,调用等价的“W”函数,并将输出中的任何string转换为“ANSI”。 这是我一直在手动做的。 那么为什么Windows不能为我做?

“ANSI”代码页基本上是遗留的:Windows 9X时代。 所有现代软件都应该是Unicode(也就是UTF-16)。

基本上,当Ansi代码页的东西是最初设计的,UTF-8甚至没有发明,所以支持多字节编码是相当杂乱的(即大多数Ansi代码页是单字节的,除了一些东亚代码页这是一个或两个字节)。 无论如何,当所有新的开发都应该以UTF-16完成时,增加对“适当的”多字节编码的支持可能被认为是不值得的。

_setmbcp()是一个VC ++ RTL函数,而不是一个Win32 API函数。 它只影响RTL如何解释字符串。 它对Win32 API A函数没有任何影响。 当他们在内部调用他们的W相对方时, A函数总是使用指定代码页0( CP_ACP )的MultiByteToWideChar()WideCharToMultiByte() )来使用系统默认的Ansi代码页进行转换。

微软国际化专家Michael Kaplan试图在他的博客上回答这个问题 。

基本上他的解释是,即使Windows API函数的“ANSI”版本是为了处理不同的代码页,历史上有一个隐含的期望,字符编码将需要每个代码点最多两个字节。 UTF-8不符合这个期望,现在改变所有这些功能将需要大量的测试。