【问题标题】:Length of a multibyte sequence in bytes, (unicode) code points, characters and cursor positions多字节序列的长度,以字节、(unicode)代码点、字符和光标位置为单位
【发布时间】:2014-08-09 03:23:07
【问题描述】:

我不确定我的假设是否正确,但我觉得多字节序列的四种长度都可以不同,以说明:

说,多字节编码是UTF-8,我们有字符串"\xc3\xb8 \xe2\x86\x82 e\xcc\x88",UTF-8编码"\u00f8 \u2182 e\u0308", "ø ↂ ë"

这个字符串的长度为:

  1. 10 字节
  2. 6 个 unicode 代码点
  3. 5 个字符
  4. 6 个屏幕位置(使用等宽字体)(ↂ 占 2 个位置)

1.) 由strlen 返回,2.) 可以通过<wchar.h> 函数确定。

但是有确定 3.) 和 4.) 的可移植方法吗? 我不确定,如果 ↂ 占用两个光标位置是针对该代码点或与所使用的字体相关的字体独立定义的,我觉得“等宽字体”和“某些字符占用多个空格”有些矛盾。至少,在Monospace 中,这个字符确实覆盖了两个光标位置。 Unicode 图表U2150 没有说明光标位置。

最后,任何字符的位置数是否为负数(我的意思是,在从左到右的脚本中,一个字符将光标位置放在左侧,反之亦然)?

【问题讨论】:

    标签: c unicode encoding


    【解决方案1】:

    但是有确定[字符和光标位置]的便携式方法吗?

    这两个都是模糊的概念。例如,罗马 10,000 是某些字体中的两个光标位置可能取决于特定应用程序选择如何呈现它。

    一般来说,人们依赖平台(例如,本机文本渲染引擎)或 ICU 之类的库来获取光标位置和形状字形等信息。

    【讨论】:

      【解决方案2】:

      Posix 接口wcwidth 可用于查找wchar_t 的“光标位置”数量。为了获取wchar_t 值(一次一个),您可以使用C99 标准库函数mbtowc,它从字符串中提取单个多字节字符并返回消耗的字节数。 (在字符串上反复调用mbtowc 并每次更新字符串指针会告诉您字符串中有多少个多字节字符,至少如果多字节编码是UTF-8。)

      wcwidthmbtowc 的组合或多或少可以告诉您字符串中有多少个字形(您的问题 #3)。 wcwidth 返回 0 的 wchar_t 是零宽度格式控件或组合字符,wcwidth 返回 -1 的 wchar_t 是非字符或控制字符(如 \n)。无论哪种方式,它都可以被忽略,因此字形计数实际上是宽度大于 0 的 wchar_t 的计数。

      这清楚地表明这四个问题有不同的答案:

      1. 字节数。

      2. 多字节码点数。

      3. wcwidth 大于 0 的多字节码点数。

      4. wcwidth大于0的多字节码位的wcwidth之和。

      话虽如此,但不能保证wcwidth 返回的值对应于当前控制台字体的实际字符宽度或应用程序正在使用的Unicode 版本。 (这两个问题我都遇到过。)wcwidth 返回的值是从当前语言环境中提取的,因此您可以编辑和重新编译您的语言环境文件以修复错误。例如,请参阅我的答案:How to get ncurses to output astral plane unicode characters

      【讨论】:

        猜你喜欢
        • 2013-05-07
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 2013-06-28
        • 2010-12-24
        相关资源
        最近更新 更多