检测NSString或NSAttributedString中的实际文本方向

时间:2013-12-23 11:00:29

标签: ios unicode nsattributedstring right-to-left

问题

是否有明确的方法来检测NSStringNSAttributedString中的文字方向是否从右向左?文本是从外部资源接收的,未在应用程序中输入(不能使用UITextInput协议方法)。

糟糕的解决方案

我一直在使用CFStringTokenizerCopyBestStringLanguage()然后+[NSLocale characterDirectionForLanguage:]检测它,但对于只有少数阿拉伯字符和许多拉丁字符串的字符串来说,这是非常不可靠的。它们在标签中显示时作为RTL处理,但不正确的方向检测会导致行为不一致。

研究

在开发过程中,我发现创建NSAttributedString时没有属性,除了字体并使用TTTAttributedLabel显示它,RTL文本与右边缘对齐。使用简单NSString时,或使用带有属性字符串的标准UILabel时,对齐方式保持不变。 因此,文本中必须有一些内容称“它是RTL”,并且有一些方法可以检测它。

我分析了我从服务器收到的内容,并且没有标准的Unicode bidi字符。这是它的外观。 JSON在ascii中发送,所有unicode字符都被转义:

"\u0643\u062a\u0628\u062a \u0648\u0648\u062c\u0650 .."

当没有出现时,它看起来像这样,\u0643位于点之前的最右边:

"كتبت ووجِ .."

据我所知,每个字符代表阿拉伯语中的单个字符,并且没有U+202B或类似的控制字符可用于轻松检测方向。

然而,当通过TTTAttributedLabel呈现此文本时,它正确对齐。我开始研究source code,它没有做任何事情来检测方向或设置对齐。它只使用CTFramesetterCreateWithAttributedString()创建了框架设置,然后,当它使用CTFrameGetLines()获取线条并使用CTFrameGetLineOrigins()线条位置时,它们已经与右边对齐。

那么,是否有人知道方向是否可以仅通过公开(并且最好是快速)API方法的文本检测到?

2 个答案:

答案 0 :(得分:0)

选中此链接对您有帮助Automatically align text in UILabel according to text language

更改左右对齐

      if (isCodePointStrongRTL(utf32chars[i]))
            return 2;
        if (isCodePointStrongLTR(utf32chars[i]))
            return 0;

答案 1 :(得分:0)

在其他问题上看到了这个评论,并认为对其他人来说检查这个问题很重要。这正是我在寻找RTL-LTR:

" 但我一直在使用一种解决方案,根据已知的RTL语言明确设置方向,并以此为出发点:

https://stackoverflow.com/a/16309559 "