我想为字符串设置一个标签:"خخخ刚刚购买:伪装工具包。“但是当我运行测试时,标签显示".just购买:伪装工具包خخخ"?
如果文本不是以阿拉伯语开头,它将显示为我设置的内容。有什么问题吗?
有谁知道如何处理这个问题吗?
发布于 2012-09-28 10:52:40
首先,请阅读卡尔·亨德森的优秀"Understanding Bidirectional (BIDI) Text in Unicode."。
信不信由你,UILabel正在按照你要求的方式进行布局。您提供了一个从右到左的字符串(从阿拉伯语开始)。它开始从右到左显示。然后嵌入一个从左到右的英文字符串,该字符串从左到右排列。然后它会看到句号,并从右到左排列,因为这是一个阿拉伯字符串,其中恰好有一些英语(正如最佳UILabel所能看出的那样)。
您想要的是一个从左到右的字符串,其中嵌入了阿拉伯语。这意味着您必须以从左到右的字符开始字符串。有两个选项:在开头添加一些英语,或者使用从左到右的零宽度标记(U+200E,LRM)将字符串的开头锚定到LTR模式。
Objective-C:
self.label.text = @"\u200eكتب just bought: Disguise Kit.";Swift:
self.label.text = "\u{200E}كتب just bought: Disguise Kit."关于U+200E的好消息是,在显示之前,您可以安全地将其添加到每个LTR字符串中。对于LTR语言,您甚至可以安全地将其放在本地化字符串的开头。如果它是多余的,它不会伤害任何东西。
还有几件事需要注意:永远不要用ككك测试这个东西,一定要用كتب(像每个好学生一样:D)或者更好的像الو这样的东西来测试。否则,你就不能分辨出什么时候阿拉伯语是向后排列的。我喜欢الو,因为它看起来非常不同。
另外,在测试时,请注意Xcode不知道如何布局阿拉伯语。因此,如果您在代码中编写任何静态字符串,它们将在编辑器中向后显示,但它们将在UI中正确显示。快把我逼疯了。
请务必参阅iOS 10+/MacOS10.12中添加的有用的相关特性的guru_meditator的answer。
发布于 2019-04-08 17:15:20
从Unicode10(和macOS 10.12)开始,String localizedStringWithFormat在占位符周围插入iOS隔离。这是一种使用混合语言方向格式化字符串的较高级别方法,无需手动插入方向标记。
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中引入的
发布于 2020-04-29 23:22:36
实际上,\u{200E} (或任何)符号可以插入到字符串文字中。
https://stackoverflow.com/questions/12366330
复制相似问题