如何检测到UILabel在Cocoa Touch中包含从右到左的语言?

JoJ*_*oJo 2 regex cocoa-touch objective-c

我在两个UILabel中显示用户注释- 一个用于用户名,另一个用于消息.两个标签都具有相同的X,Y坐标,但消息标签前面的空格等于用户名的宽度.这种技术可以帮助我轻松支持多行消息.

用户编写阿拉伯语消息时会出现问题.阿拉伯语是一种从左到右的语言.这意味着,我必须在阿拉伯字符串的末尾添加空格,而不是开头.正如您在下面的屏幕截图中看到的那样,我没有做出这种区分,并且阿拉伯语消息遇到了用户名.那么如何检测到UILabel 的文本属性(NSString)是用从右到左的语言编写的呢?

阿拉伯

失败尝试1:正则表达式

我尝试使用正则表达式,但以下函数始终为每个字符串返回false,包括阿拉伯语.

@implementation UILabel (position)

- (BOOL) containsArabic
{
    NSError* error;
    NSRegularExpression* regex = [NSRegularExpression
        regularExpressionWithPattern:@"\p{Arabic}" 
        options:0
        error:&error
    ];
    return error == nil 
        && [regex 
            numberOfMatchesInString:self.text 
            options:0 
            range:NSMakeRange(0, self.text.length)] > 0;
}

@end
Run Code Online (Sandbox Code Playgroud)

失败尝试2:NSLocale

- (BOOL) containsArabic
{
    NSString *isoLangCode = (NSString*)CFStringTokenizerCopyBestStringLanguage(
       (CFStringRef)self.text, 
       CFRangeMake(
           0, 
           self.text.length
       )
    );
    NSLocaleLanguageDirection direction = [NSLocale lineDirectionForLanguage:isoLangCode];
    NSLog(@"++++++");
    NSLog(@"%@", self.text);
    NSLog(@"%d", direction);
    return direction == NSLocaleLanguageDirectionRightToLeft;
}
Run Code Online (Sandbox Code Playgroud)

输出无用:

2012-05-28 10:59:11.454 [2110:707] MANCHESTER CITY VS MANCHESTER UNITED LIVE HD
2012-05-28 10:59:11.461 [2110:707] 0
2012-05-28 10:59:11.474 [2110:707] ++++++
2012-05-28 10:59:11.477 [2110:707] tak
2012-05-28 10:59:11.484 [2110:707] 0
2012-05-28 10:59:11.511 [2110:707] ++++++
2012-05-28 10:59:11.513 [2110:707] ŸàŸÜŸáÿßÿ±ŸÉ ÿ?ÿ?ŸäÿØ
2012-05-28 10:59:11.520 [2110:707] 3
2012-05-28 10:59:11.704 [2110:707] ++++++
2012-05-28 10:59:11.712 [2110:707] ŸÜŸáÿßÿ±ŸÉ ÿ?ÿ?ŸäÿØ
2012-05-28 10:59:11.740 [2110:707] 3
2012-05-28 10:59:11.763 [2110:707] ++++++
2012-05-28 10:59:11.767 [2110:707] i think i am close
2012-05-28 10:59:11.772 [2110:707] 3
Run Code Online (Sandbox Code Playgroud)

dma*_*man 7

这个答案假定你使用的是ARC:

NSString *stringToTest = @"Some Foreign Language";

NSString *isoLangCode = (__bridge_transfer NSString*)CFStringTokenizerCopyBestStringLanguage((__bridge CFStringRef)stringToTest, CFRangeMake(0, stringToTest.length));

NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLangauge:isoLangCode];
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用NSLocale API的lineDirectionForLanguage:方法来确定语言行方向.