2010-06-08 113 views
17

在Windows _setmbcp功能允许任何有效的代码页...为什么UTF-8不允许作为“ANSI”代码页?

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

OK,不支持UTF-7品牌意义:字符具有非唯一表示,并且会引入复杂性和安全风险。

但为什么不是UTF-8?根据我的理解,Windows API函数的“ANSI”版本将它们的参数转换为UTF-16,调用等价的“W”函数,并将输出中的任何字符串转换为“ANSI”。这是我一直在做的手动。那么为什么Windows不能为我做?

+3

您是否知道CP65001是Windows'UTF-8的名称?虽然在'WriteFile()'中有一些错误,但它没有很好的记录,但是你可以在很多地方使用它。 – hippietrail 2011-04-01 14:18:21

回答

9

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

+15

我同意所有新的开发应该在* Unicode *。但我有理由建议使用UTF-8而不是UTF-16。 (1)我的团队在任何人对此不屑一顾之前写了一百万行非Unicode感知代码,现在要将所有基于char的字符串更改为基于wchar_t的字符串将是一项巨大的努力。 (2)我们计划将我们的产品移植到Linux上,而UTF-8更倾向于Linux。 – dan04 2010-06-08 06:53:36

5

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

+0

Microsoft是否明确说明了这一点?如果他们真的这样做,那么我看不出有什么理由不应该以某种方式告诉运行时在使用ANSI函数时使用CP_UTF8。 – Calmarius 2014-10-08 11:32:28

3

微软的国际化专家Michael Kaplan试图回答这个问题on his blog

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

+0

ANSI代码页不限于Windows中的两个字节。 char的进展是SBCS-> DBCS-> MBCS,对于wchar_t则是UCS2-> UTF16。我没有看到MBCS不能使用UTF8代码页和char的理由。 – evoskuil 2014-05-21 00:58:46

+0

@evoskuil什么是Windows支持的ANSI代码页的示例,每个代码点使用两个以上的字节? AFAIK,对于Windows,MBCS表示DBCS(而DBCS表示1或2个字节的字符),而http://msdn.microsoft.com/en-us/library/cwe8bzh0.aspx显然证实了这一点。 – jamesdlin 2014-05-21 02:22:56

+1

请参见[代码页标识符](http:// msdn。microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).asp)我上面贴出: Windows XP及更高版本:GB18030简体中文(4字节) 您发布的参考状态:“支持在所有平台上称为双字节字符集(DBCS)的多字节字符集(MBCS)形式。” IOW称为DBCS的表单是MBCS的一个子集。这是针对“所有平台”的。 进一步查看页面上的内容:“在支持MBCS的Windows操作系统版本上运行时[工具]完全支持MBCS。” – evoskuil 2014-05-21 06:41:11