带有文本方向标记的Unicode字符串的子字符串

时间:2015-08-20 10:43:50

标签: string unicode

我想在字形簇编号 i 中将给定的Unicode字符串拆分为两部分(“head”和“tail”)。示例应用程序包括:

  • 我正在与Twitter整合,并希望提取标题的前140个字素集群以作为推文分享
  • 我正在建立一个博客,你想要在列表中显示前300个字素集群,将其余部分隐藏在“阅读更多”下。
  • 我正在构建一个速读应用程序,并希望提取字符串的单个单词。
  • 我正在构建一个应用程序,根据特殊标记动画部分字符串。
  • (无数)

假设我有一个库函数将字符串拆分为字形集群。 (可能是Cocoa NSString的内置字形集群枚举,暂时忘记它在新的Unicode 6国家指标上,或JavaScript中的grapheme-breaker,或恰好在预期输入上运行的临时正则表达式方法或其他东西。)

天真的方法是将字符串拆分为一个字形集群数组,然后从元素 i 中取一个子数组到元素 j ,然后加入子数组以形成一个新字符串。

事实上,这就是我到目前为止一直在做的事情。

但是,我已经意识到如果字符串包含文本方向标记,那么任务就不那么简单了:

  1. 阅读顺序可能与写作顺序不符。
  2. 如果文本方向标记碰巧进入头部,尾部会被错误地解释,所以你需要以某种方式在尾部恢复它。
  3. 我想知道:

    1. 是否有现成的,可靠的算法来处理这个问题? (不用说,字母搜索出来了)
    2. 是否有现有的库来处理这个?
    3. 在存在不同文本方向的情况下,根据字素集群索引制定任务是否有意义?
    4. 总体而言,在问题开头部分处理应用程序的最佳方式是什么?
    5. 问题是平台和语言无关;这对所有人来说都是一个常见问题,而且我对各种各样的东西感兴趣(至少JavaScript,Ruby,Python,Objective-C / Swift,Go,Java,.NET)。

1 个答案:

答案 0 :(得分:1)

您无需担心文本的写入顺序 - 这对于实际排版并使用Unicode Bidirectional Algorithm呈现文本的代码来说是个问题。如果你只是分割文本,你的工作就会简单得多(相对而言)。 Unicode标准的Chapter 23说:

  

有状态格式控件

     

Unicode标准包含一个小数字   成对的有状态控制。这些字符成对使用   起始字符(或序列)和终止字符。   即使特定的人不支持这些字符   实施时,由于其配对性质可能会出现并发症。   每当剪切,复制,粘贴或删除文本时,这些字符都可以   变得不成对。为了避免这个问题,理想情况下都要复制任何文本   及其上下文(删除的位置或插入的目标)会   进行修改,以保持所有有效的配对   每一段文字。然而,这个过程可能非常复杂   并且通常不会 - 或者如果尝试不正确。

从Unicode 8.0开始,您只需要担心三组配对控制字符(以及两个已弃用的集合):

  • 双向覆盖:U+202A - U+202E
  • 注释字符:U+FFF9 - U+FFFB
  • 音乐梁和连线:U+1D173 - U+1D17A

Unicode标准中的相关部分解释了这些字符的工作原理。

在大多数情况下 - 特别是对于您描述的那些 - 只需确保双向状态是一致的并保留每个子字符串就足够了。注释和音乐功能的处理是特定于应用程序的,并且它们在这些应用程序之外的使用是非常罕见。

至于你的其他问题,字形集群是处理这类文本的正确方法(尽管请注意Twitter counts code points)。确定文本方向是一个复杂的过程,但它主要是字符本身的属性,而不是任何注释或周围文本。 Unicode word boundary algorithm也可能对您有用。