我正在尝试在 Windows 中实现文本支持,以便以后也迁移到 Linux 平台。以统一的方式支持国际语言是理想的,但在考虑到所讨论的两个平台时,这似乎并不容易实现。我花了相当多的时间阅读 UNICODE、UTF-8(和其他编码)、widechars 等,这是我到目前为止所理解的:
UNICODE 作为标准,描述了可映射的字符集及其出现的顺序。我将其称为“什么”:UNICODE 指定可用的内容。
UTF-8(和其他编码)指定如何:每个字符将如何以二进制格式表示。
现在,在windows上,他们最初选择了UCS-2编码,但不符合要求,所以他们有UTF-16,必要时也是多字符。
所以这是两难境地:
- Windows 内部仅支持 UTF-16,因此如果您想支持国际字符,则必须转换为它们的 Widechar 版本以相应地使用操作系统调用。似乎不支持使用多字节 UTF-8 字符串调用 CreateFileA() 之类的东西,并让它看起来正确。这个对吗?
- 在 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() 函数)。