UTF 和 UCS 有什么区别。
在 C++ 字符串中表示非欧洲字符集(使用 UTF)的最佳方法是什么。我想知道您对以下方面的建议:
- 代码内部的表示
- 用于运行时的字符串操作
- 用于将字符串用于显示目的。
- 最佳存储表示(即在文件中)
- 最佳有线传输格式(在可能位于不同架构且具有不同标准语言环境的应用程序之间传输)
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-8 作为内部格式。如果您需要与现有的基于 ASCII 或 ISO-8859 的系统进行互操作,这很好,因为 UTF-8 文本中间不存在 NULL 字节——它们在 UTF-16 或 UCS-4 中。
您是否阅读过 Joel Spolsky 关于每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有任何借口!)的文章?
我会建议:
wchar_t
或等效的表示。UTF-8 在存储和有线情况下的优势在于机器字节序不是一个因素。使用固定大小的字符(例如wchar_t
在代码中)的优点是您可以轻松找出字符串的长度,而无需扫描它。
UTC 是协调世界时,而不是字符集(我没有找到任何称为 UTC 的字符集)。
对于内部表示,您可能希望使用wchar_t
每个字符,而 std::wstring 用于字符串。它们为每个字符使用 2 个字节,因此查找和随机访问会很快。
对于存储,如果大部分数据不是 ASCII(即代码 >= 128),您可能希望使用 UTF-16,它与序列化wstring
和wchar_t
.
由于 UTF-16 可以是小端或大端,对于有线传输,请尝试将其转换为与体系结构无关的 UTF-8。
在代码内部的表示中,您最好对欧洲和非欧洲字符执行此操作:
\uNNNN
在 \u0020 到 \u007E 范围内的字符和一点点空格(例如行尾)可以写成普通字符。\u0080 以上的任何内容,如果您将其编写为普通字符,则它将仅在您的代码页中编译(例如,在法国可以但在俄罗斯中断,在俄罗斯可以但在日本中断,在中国可以但在美国中断,等等.)。