我目前正在开发一个跨平台的 C++ 库,我打算了解 Unicode。我目前通过 typedef 和宏对 std::string 或 std::wstring 提供编译时支持。这种方法的缺点是它迫使您使用宏L("string")
,并大量使用基于字符类型的模板。
支持和反对仅支持 std::wstring 的论点是什么?
使用 std::wstring 会完全阻碍 GNU/Linux 用户群,而 UTF-8 编码是首选?
我目前正在开发一个跨平台的 C++ 库,我打算了解 Unicode。我目前通过 typedef 和宏对 std::string 或 std::wstring 提供编译时支持。这种方法的缺点是它迫使您使用宏L("string")
,并大量使用基于字符类型的模板。
支持和反对仅支持 std::wstring 的论点是什么?
使用 std::wstring 会完全阻碍 GNU/Linux 用户群,而 UTF-8 编码是首选?
很多人会希望将 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。
支持和反对仅支持 std::wstring 的论点是什么?
支持使用宽字符的论点是它可以做所有窄字符可以做的事情,甚至更多。
我知道的反对它的论点是:
至于灵活性:我维护了一个可以处理窄字符和宽字符的库(几个 kLoC)。其中大部分是通过字符类型作为模板参数,我不记得有任何宏(除了UNICODE
,就是)。但是,并非所有这些都是灵活的,其中有一些代码最终需要要么char
或wchar_t
字符串。(使用宽字符使内部键字符串变宽是没有意义的。)
用户可以决定是只需要窄字符支持(在这种情况下"string"
很好)还是只需要宽字符支持(这需要他们使用L"string"
),或者他们是否想要同时支持这两者,也(这需要类似的东西T("string")
)。
为了:
反对:
我会说使用std::string
orstd::wstring
是无关紧要的。
无论如何,都没有提供适当的 Unicode 支持。
如果您需要国际化,那么您需要适当的 Unicode 支持,并且应该开始研究诸如 ICU 之类的库。
之后,这是使用哪种编码的问题,这取决于您所在的平台:将依赖于操作系统的设施包装在抽象层后面,并在适用时在实现层中进行转换。
不要担心您使用的 Unicode 库内部使用的编码(或构建?哼),这是性能问题,不应影响库本身的使用。
坏处:
因为 wstring 是真正的 UCS-2 而不是 UTF-16。总有一天我会踢你的小腿。它会踢得很厉害。