我想在字形簇编号 i 中将给定的Unicode字符串拆分为两部分(“head”和“tail”)。示例应用程序包括:
假设我有一个库函数将字符串拆分为字形集群。 (可能是Cocoa NSString的内置字形集群枚举,暂时忘记它在新的Unicode 6国家指标上,或JavaScript中的grapheme-breaker,或恰好在预期输入上运行的临时正则表达式方法或其他东西。)
天真的方法是将字符串拆分为一个字形集群数组,然后从元素 i 中取一个子数组到元素 j ,然后加入子数组以形成一个新字符串。
事实上,这就是我到目前为止一直在做的事情。
但是,我已经意识到如果字符串包含文本方向标记,那么任务就不那么简单了:
我想知道:
问题是平台和语言无关;这对所有人来说都是一个常见问题,而且我对各种各样的东西感兴趣(至少JavaScript,Ruby,Python,Objective-C / Swift,Go,Java,.NET)。
答案 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也可能对您有用。