代码之家  ›  专栏  ›  技术社区  ›  Loki Astari

C++代码中的UTF用法

  •  6
  • Loki Astari  · 技术社区  · 16 年前

    utf和ucs的区别是什么?

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

    • 代码内部的内部表示
      • 用于运行时的字符串操作
      • 用于将字符串用于显示目的。
    • 最佳存储表示( 在文件中)
    • 最好的在线传输格式(在不同架构和不同标准区域设置的应用程序之间传输)
    5 回复  |  直到 16 年前
        1
  •  8
  •   John Millikin    16 年前

    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文本的中间不存在空字节——它们是UTF-16或UCS-4格式。

        3
  •  2
  •   John Millikin    16 年前

    我建议:

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

    UTF-8在存储和有线情况下的优势在于,机器端隙不是一个因素。使用固定大小字符的优点,如 瓦查特 在代码中,您可以很容易地找到字符串的长度,而不必扫描它。

        4
  •  0
  •   Randy Sugianto 'Yuku'    16 年前

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

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

    对于存储,如果大多数数据不是ASCII(即code>=128),则可能需要使用与序列化几乎相同的utf-16 wstring 瓦查特 .

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

        5
  •  0
  •   Windows programmer    16 年前

    在代码内部的内部表示中,最好对欧洲字符和非欧洲字符都这样做:

    UNNNN

    在\u0020到\u007e范围内的字符以及少量空白(例如行尾)可以作为普通字符写入。以上任何内容,如果您将其作为普通字符编写,则它将只在代码页中编译(例如,在法国可以,但在俄罗斯可以,在俄罗斯可以,但在日本可以,在中国可以,但在美国可以,等等)。