C ++ wchar_t和wstrings有什么“错误”?宽角色有哪些替代方案?

时间:2012-06-19 19:00:51

标签: c++ winapi unicode internationalization wstring

我见过很多C ++社区的人(尤其是freenode上的## c ++)对wstringswchar_t的使用以及它们在windows api中的使用表示不满。 wchar_twstring究竟是什么“错误”,如果我想支持国际化,那么广泛字符有哪些替代方案?

2 个答案:

答案 0 :(得分:18)

wchar_t没有“错误”。问题是,在NT 3.x天,微软决定Unicode是好的(它是),并将Unicode实现为16位,wchar_t字符。因此,大多数90年代中期的微软文献几乎等同于Unicode == utf16 == wchar_t。

遗憾的是,事实并非如此。在所有情况下,“宽字符”在所有平台上必须为2个字节。

这是关于“Unicode”的最好的引用之一(独立于这个问题,独立于C ++)我见过:我高度推荐它:

我真的相信处理“8位ASCII”与“Win32宽字符”与“wchar_t-in-general”的最佳方式只是接受“Windows不同”......并相应地编码。

... IMHO

PS:

我完全赞同上面的jamesdlin:

  

在Windows上,你真的没有选择。它的内部API是   为UCS-2设计,从那时起它是合理的   在可变长度的UTF-8和UTF-16编码之前   标准化。但现在他们支持UTF-16,他们最终得到了   两个世界中最糟糕的。

答案 1 :(得分:-3)

强制性阅读:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

如果你用Java或.Net(VB.Net或C#)编程 - 它在很大程度上是一个非问题:默认情况下都是Unicode。如果您使用“经典”Win32 API编程,最好的办法是使用TCHAR和_T()宏(而不是明确地使用wchar)。

我认为所有Microsoft编译器VS2005及更高版本默认为C / C ++的16位(部分原因是我仍然使用MSVS 6.0;)。

另一个好处(虽然有点过时的链接):