题
UTF 和 UCS 有什么区别。
在 C++ 字符串中表示非欧洲字符集(使用 UTF)的最佳方法是什么?我想知道您对以下方面的建议:
- 代码内部的表示
- 用于运行时的字符串操作
- 用于将字符串用于显示目的。
- 最佳存储表示(IE。 在文件中)
- 最佳有线传输格式(可能位于不同架构并具有不同标准区域设置的应用程序之间传输)
解决方案
UTF 和 UCS 有什么区别。
UCS 编码是固定宽度的,并以每个字符使用多少字节来标记。例如,UCS-2 每个字符需要 2 个字节。代码点超出可用范围的字符无法使用 UCS 编码进行编码。
UTF 编码是可变宽度的,并以存储字符的最小位数来标记。例如,UTF-16 要求每个字符至少 16 位(2 个字节)。具有较大代码点的字符使用较大数量的字节进行编码 - UTF-16 中的星体字符为 4 个字节。
- 代码内部的表示
- 最佳存储表示(即在文件中)
- 最佳线传输格式(可在应用程序之间传输 采用不同的架构,并且 不同的标准位置)
对于现代系统来说,最合理的存储和传输编码是UTF-8。在某些特殊情况下,其他可能也适用——UTF-7 适用于旧的邮件服务器,UTF-16 适用于写得不好的文本编辑器——但 UTF-8 是最常见的。
首选内部代表将取决于您的平台。在 Windows 中,它是 UTF-16。在 UNIX 中,它是 UCS-4。各有各的优点:
- UTF-16 字符串永远不会比 UCS-4 字符串使用更多的内存。如果您存储许多主要在基本多语言平面 (BMP) 中包含字符的大型字符串,则 UTF-16 所需的空间将比 UCS-4 少得多。在 BMP 之外,它将使用相同的数量。
- UCS-4 更容易推理。由于 UTF-16 字符可能会拆分为多个“代理对”,因此正确拆分或呈现字符串可能具有挑战性。UCS-4文本没有这个问题。UCS-4 的行为也很像“char”数组中的 ASCII 文本,因此可以轻松移植现有的文本算法。
最后,一些系统使用 UTF-8 作为内部格式。如果您需要与现有的基于 ASCII 或 ISO-8859 的系统进行互操作,这非常有用,因为 UTF-8 文本中间不存在 NULL 字节——它们位于 UTF-16 或 UCS-4 中。
其他提示
你读过乔尔·斯波尔斯基(Joel Spolsky)的文章吗? 每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低限度(没有任何借口!)?
我会建议:
- 对于代码中的表示,
wchar_t
或同等学历。 - 对于存储表示,UTF-8。
- 对于有线表示,UTF-8。
UTF-8 在存储和有线情况下的优点是机器字节序不是一个因素。使用固定大小字符的优点,例如 wchar_t
在代码中,您可以轻松地找出字符串的长度,而无需扫描它。
UTC 是协调世界时,而不是字符集(我没有找到任何称为 UTC 的字符集)。
对于内部表示,您可能需要使用 wchar_t
对于每个字符,std::wstring 对于字符串。它们每个字符恰好使用 2 个字节,因此查找和随机访问会很快。
对于存储,如果大部分数据不是 ASCII(即code >= 128),您可能需要使用 UTF-16,它与序列化几乎相同 wstring
和 wchar_t
.
由于 UTF-16 可以是小端或大端,对于有线传输,请尝试将其转换为独立于体系结构的 UTF-8。
在代码内部的表示中,您最好对欧洲和非欧洲字符执行此操作:
\uNNNN
\u0020 到 \u007E 范围内的字符,以及一点空白(例如行尾)可以写成普通字符。任何高于 \u0080 的内容,如果您将其写为普通字符,那么它只会在您的代码页中编译(例如在法国可以,但在俄罗斯不行,在俄罗斯可以,但在日本不行,在中国行,但在美国不行,等等)。