6

UTF 和 UCS 有什么区别。

在 C++ 字符串中表示非欧洲字符集(使用 UTF)的最佳方法是什么。我想知道您对以下方面的建议:

  • 代码内部的表示
    • 用于运行时的字符串操作
    • 用于将字符串用于显示目的。
  • 最佳存储表示(在文件中)
  • 最佳有线传输格式(在可能位于不同架构且具有不同标准语言环境的应用程序之间传输)
4

5 回答 5

8

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 中。

于 2008-10-14T06:17:45.723 回答
3

您是否阅读过 Joel Spolsky 关于每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有任何借口!)的文章?

于 2008-10-14T05:46:34.070 回答
2

我会建议:

  • 用于代码wchar_t或等效的表示。
  • 对于存储表示,UTF-8。
  • 对于电线表示,UTF-8。

UTF-8 在存储和有线情况下的优势在于机器字节序不是一个因素。使用固定大小的字符(例如wchar_t在代码中)的优点是您可以轻松找出字符串的长度,而无需扫描它。

于 2008-10-14T05:42:55.340 回答
0

UTC 是协调世界时,而不是字符集(我没有找到任何称为 UTC 的字符集)。

对于内部表示,您可能希望使用wchar_t每个字符,而 std::wstring 用于字符串。它们为每个字符使用 2 个字节,因此查找和随机访问会很快。

对于存储,如果大部分数据不是 ASCII(即代码 >= 128),您可能希望使用 UTF-16,它与序列化wstringwchar_t.

由于 UTF-16 可以是小端或大端,对于有线传输,请尝试将其转换为与体系结构无关的 UTF-8。

于 2008-10-14T05:42:42.550 回答
0

在代码内部的表示中,您最好对欧洲和非欧洲字符执行此操作:

\uNNNN

在 \u0020 到 \u007E 范围内的字符和一点点空格(例如行尾)可以写成普通字符。\u0080 以上的任何内容,如果您将其编写为普通字符,则它将仅在您的代码页中编译(例如,在法国可以但在俄罗斯中断,在俄罗斯可以但在日本中断,在中国可以但在美国中断,等等.)。

于 2008-10-14T07:02:07.443 回答