6

我目前正在开发一个跨平台的 C++ 库,我打算了解 Unicode。我目前通过 typedef 和宏对 std::string 或 std::wstring 提供编译时支持。这种方法的缺点是它迫使您使用宏L("string"),并大量使用基于字符类型的模板。

支持和反对仅支持 std::wstring 的论点是什么?

使用 std::wstring 会完全阻碍 GNU/Linux 用户群,而 UTF-8 编码是首选?

4

5 回答 5

3

很多人会希望将 unicode 与 UTF-8 (std::string) 而不是 UCS-2 (std::wstring) 一起使用。UTF-8 是许多 linux 发行版和数据库的标准编码 - 所以不支持它将是一个巨大的劣势。在 Linux 上,每次以字符串为参数调用库中的函数都需要用户将(本机)UTF-8 字符串转换为 std::wstring。

在 gcc/linux 上 std::wstring 的每个字符将有 4 个字节,而在 Windows 上将有 2 个字节。这在读取或写入文件(以及将它们从/复制到不同平台)时可能会导致奇怪的效果。我宁愿为跨平台项目推荐 UTF-8/std::string。

于 2010-09-06T12:44:20.213 回答
2

支持和反对仅支持 std::wstring 的论点是什么?

支持使用宽字符的论点是它可以做所有窄字符可以做的事情,甚至更多。

我知道的反对它的论点是:

  • 宽字符需要更多空间(这几乎不相关,原则上中国人不会比美国人更头痛)
  • 使用宽字符让一些西方人感到头疼,他们习惯于将所有字符都用于 7 位(并且不愿意学习注意不要将字符类型用于实际字符与其他用途的混合使用)

至于灵活性:我维护了一个可以处理窄字符和宽字符的库(几个 kLoC)。其中大部分是通过字符类型作为模板参数,我不记得有任何宏(除了UNICODE,就是)。但是,并非所有这些都是灵活的,其中有一些代码最终需要要么charwchar_t字符串。(使用宽字符使内部键字符串变宽是没有意义的。)
用户可以决定是只需要窄字符支持(在这种情况下"string"很好)还是只需要宽字符支持(这需要他们使用L"string"),或者他们是否想要同时支持这两者,也(这需要类似的东西T("string"))。

于 2010-09-06T12:33:38.787 回答
2

为了:

反对:

  • 您可能必须与不支持 i18n 的代码交互。但就像任何优秀的库编写者一样,您只需将混乱隐藏在易于使用的界面后面,对吗?对?
于 2010-09-06T12:41:38.487 回答
2

我会说使用std::stringorstd::wstring是无关紧要的。

无论如何,都没有提供适当的 Unicode 支持。

如果您需要国际化,那么您需要适当的 Unicode 支持,并且应该开始研究诸如 ICU 之类的库。

之后,这是使用哪种编码的问题,这取决于您所在的平台:将依赖于操作系统的设施包装在抽象层后面,并在适用时在实现层中进行转换。

不要担心您使用的 Unicode 库内部使用的编码(或构建?哼),这是性能问题,不应影响库本身的使用。

于 2010-09-06T14:50:51.560 回答
0

坏处:

因为 wstring 是真正的 UCS-2 而不是 UTF-16。总有一天我会踢你的小腿。它会踢得很厉害。

于 2010-09-06T12:50:30.043 回答