我试图在Windows上实现文本支持,并打算以后也移到Linux平台。理想情况下,希望以统一的方式支持国际化语言,但考虑到这两个平台时,似乎很难实现。我花了相当多的时间阅读有关UNICODE、UTF-8(和其他编码)、widechar等方面的资料,至今所了解的如下:
UNICODE作为标准,描述了可映射字符集及其出现顺序。我把这称为"what": UNICODE指定了可用的内容。
UTF-8(和其他编码)则指定了"how": 每个字符将以何种二进制格式表示。
现在,在Windows上,他们最初选择了UCS-2编码,但这未能满足要求,因此他们使用了UTF-16,这也是多字符的。
因此,这里存在一个困境:
- Windows内部仅支持UTF-16,因此如果要支持国际字符,必须将其转换为宽字符版本,以便相应地使用操作系统调用。似乎没有支持使用类似CreateFileA()的函数来处理多字节UTF-8字符串并使其显示正确的方法。这是正确的吗?
- C语言中有一些支持多字节的函数(_mbscat、_mbscpy等),但在Windows上,这些函数的字符类型被定义为unsigned char*。鉴于_mbs系列函数不是一个完整的集合(例如,没有将多字节字符串转换为长整型的_mbstol函数),必须使用某些运行时函数的char*版本,这会导致编译器出错,因为这些函数之间存在有符号/无符号类型差异。有人甚至使用它们吗?你只是进行大量的转换以解决错误问题吗?
- 在C++中,std::string有迭代器,但是这些迭代器基于char_type,而不是基于码点。因此,如果我在std::string::iterator上执行++操作,我会得到下一个char_type,而不是下一个码点。同样地,如果调用std::string::operator[],你会得到一个指向char_type的引用,它很可能不是一个完整的码点。那么如何通过码点迭代std::string?(C语言中有_mbsinc()函数)。
señor
中,您不想在n
和~
之间插入一个字符。(这种特殊情况可以通过组合来解决,但并非所有此类字符都可以组合。) - Dietrich Epp