我想将标签设置为字符串:“خخخ刚购买:伪装套件。” 但是当我进行测试时,标签显示“.just buy:Disguise Kitخخخ”?
如果文字不是以阿拉伯语开头,它将显示为我设置的内容。 有什么问题?
有人知道如何处理这个问题吗?
答案 0 :(得分:35)
首先,阅读Cal Henderson的优秀"Understanding Bidirectional (BIDI) Text in Unicode."。
信不信由你,UILabel
正按照你提出的方式解决问题。你提供了一个从右到左的字符串(以阿拉伯语开头)。它开始显示从右到左。然后,您嵌入了一个从左到右排列的从左到右的英文字符串。然后它会看到这段时间,然后从右到左排列,因为这是一个阿拉伯字符串,恰好有一些英语(最好UILabel
可以告诉)。
您的意思是从左到右的字符串,其中嵌入了阿拉伯语。这意味着您必须以从左到右的字符开始字符串。两个选项:在开头添加一些英语,或使用零宽度从左到右标记(U + 200E,LRM)将字符串的开头锚定到LTR模式。
<强>目标-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中正确显示。让我疯狂。
答案 1 :(得分: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
中引入的答案 2 :(得分:0)
实际上,可以将\ u {200E}(或任意)符号插入字符串文字中。