在Xcode中,如何显示合并英语+阿拉伯语并以阿拉伯语开头的文本?

问题描述 投票:11回答:2

我想将标签设置为字符串:“خخخ刚购买:伪装套件。”但是当我进行测试时,标签显示“.just buy:Disguise Kitخخخ”?

如果文本不是以阿拉伯语开头,它将显示为我设置的内容。有什么问题?

有人知道如何处理这个问题吗?

iphone xcode arabic
2个回答
36
投票

首先,阅读Cal Henderson的优秀"Understanding Bidirectional (BIDI) Text in Unicode."

信不信由你,UILabel正按照你的要求铺设它。你提供了一个从右到左的字符串(以阿拉伯语开头)。它开始显示从右到左。然后,您嵌入了一个从左到右排列的从左到右的英文字符串。然后它会看到这段时间,然后从右到左排出,因为这是一个阿拉伯字符串,恰好有一些英语(正如UILabel所说的那样)。

你的意思是从左到右的字符串嵌入阿拉伯语。这意味着您必须以从左到右的字符开始字符串。两个选项:在开头添加一些英语,或使用零宽度从左到右标记(U + 200E,LRM)将字符串的开头锚定到LTR模式。

Objective-C的:

self.label.text = @"\u200eكتب just bought: Disguise Kit.";

迅速:

self.label.text = "\u{200E}كتب just bought: Disguise Kit."

关于U + 200E的好消息是,您可以在显示之前将其安全地添加到每个LTR字符串。您甚至可以安全地将它放在LTR语言的本地化字符串的开头。如果它是多余的,它不会伤害任何东西。

还有其他一些需要注意的事项:永远不要用ككك来测试这些东西,总是用كتب(就像每个好学生:D)或更好的东西来测试,比如الو。否则你无法判断阿拉伯语何时向后排列。我喜欢الو,因为它看起来非常不同。

此外,在测试时,请注意Xcode不知道如何布局阿拉伯语。因此,如果您在代码中编写任何静态字符串,它们将在编辑器中向后显示,但它们将在UI中正确显示。让我发狂。


0
投票

由于iOS 10(和macOS 10.12)String localizedStringWithFormat在占位符周围插入Unicode隔离。这是一种更高级别的方式来格式化具有混合语言方向的字符串,而无需手动插入方向标记。

String.localizedStringWithFormat("%@ just bought: Disguise Kit.", "خخخ")
// "⁨خخخ⁩ just bought: Disguise Kit."

相比于:

String(format: "%@ just bought: Disguise Kit.", "خخخ")
// ".just bought: Disguise Kit خخخ"

要查看localizedStringWithFormat正在执行的操作:

let scalars = String.localizedStringWithFormat("%@ just bought: Disguise Kit.", "خخخ")
    .unicodeScalars.map { "U+\(String(format: "%04X", $0.value))" }
print(scalars)
// ["U+2068", "U+062E", "U+062E", "U+062E", "U+2069", "U+0020", ...

其中U + 2068是第一强隔离,而U + 2069是POP定向隔离。您可以在以下网站阅读有关分离物的更多信息:https://www.unicode.org/reports/tr9/tr9-41.html#Explicit_Directional_Isolates

此功能是在WWDC 2016 session 232 What's New in International User Interfaces中引入的

© www.soinside.com 2019 - 2024. All rights reserved.