我们有一个项目,由于历史原因,字符串处理是编码和表示的杂音;我们肯定有一些地方只能可靠地处理 ASCII,一些地方可能使用 UTF-8,我怀疑外围的一些地方正在使用特定于平台的 8 位编码(当然在我们不同的目标平台之间有所不同),各种设计为采用 UCS-2 的地方,也许还有一些很乐意在 UTF-16 上运行的地方——所有这些地方有时都作为 C 风格的字符串 ( char*
, CHAR16*
) 传递,有时作为 C++ 字符串 ( std::string
, std::basic_string<CHAR16>
) 传递。当然,文档方面的内容很少。
作为解开这个混乱的第一步,我想建立一个类型系统,为不同的编码使用真正不同的类型。
我想到的一个想法是使用 egsigned char
作为 ASCII 字符串和unsigned char
UTF-8 字符串以及char16_t
UCS-2 和short
UTF-16(或类似的东西)的基础,但这意味着我不会不能直接使用字符串文字。此外,能够简单地将 ASCII 字符串提供给期望 UTF-8 的函数(但反之亦然)会很整洁。
对于如何解决这个问题,或者甚至是工作代码,你有什么聪明的建议吗?
代码需要与 C++11 兼容。
请不要回答“始终始终使用 UTF-8”这样的答案,因为这几乎是我的最终目标;相反,这是关于创建一个我认为可以帮助我实现目标的工具。
-- 附录 --
我可能应该提到我认为我们已经遇到了字符串编码不能正确“排列”的问题,例如 UTF-16 字符串被传递给只能处理 UCS-2 字符串或特定于平台的 8 位字符串的函数被传递给需要 ASCII 字符串的函数。就在昨天,我发现专用的转换函数在其名称中带有“ASCII”,事实上它实际上会转换为/从 Latin-1 而不是 ASCII。