【发布时间】:2019-06-16 07:33:03
【问题描述】:
我们有一个项目,由于历史原因,字符串处理是编码和表示的杂音;我们肯定有一些地方只能可靠地处理 ASCII,一些地方可能使用 UTF-8,我怀疑外围的一些地方正在使用特定于平台的 8 位编码(当然在我们不同的目标平台之间有所不同),各种设计为采用 UCS-2 的地方,也许还有一些很乐意在 UTF-16 上运行的地方——所有这些地方有时都作为 C 风格的字符串(char*,CHAR16*)传递,有时作为 C++ 字符串( std::string,std::basic_string<CHAR16>)。当然,在文档方面很少。
作为解开这个混乱的第一步,我想建立一个类型系统,使用真正不同的类型来处理不同的编码。
我想到的一个想法是使用例如signed 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”,事实上它实际上可以转换为拉丁语 1 而不是 ASCII。
【问题讨论】:
-
utf8_string s = {"foo"};可能是您的目标。换句话说,继续使用例如std::string作为实现细节并将其包装在一个结构中。在顶部撒上一些重载的运算符,您应该能够逐步转换代码而不会出现太多问题。 -
从不同的来源获取正确的编码是一项艰巨的工作。虽然你可以用 UTF8 很好地表示任何编码,但最后你应该坚持下去。
标签: c++ utf-8 ascii utf-16 ucs2