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

其他提示

我会建议:

  • 对于代码中的表示, wchar_t 或同等学历。
  • 对于存储表示,UTF-8。
  • 对于有线表示,UTF-8。

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

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

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

对于存储,如果大部分数据不是 ASCII(即code >= 128),您可能需要使用 UTF-16,它与序列化几乎相同 wstringwchar_t.

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

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

\uNNNN

\u0020 到 \u007E 范围内的字符,以及一点空白(例如行尾)可以写成普通字符。任何高于 \u0080 的内容,如果您将其写为普通字符,那么它只会在您的代码页中编译(例如在法国可以,但在俄罗斯不行,在俄罗斯可以,但在日本不行,在中国行,但在美国不行,等等)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top