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

use*_*503 11 iphone xcode arabic

我想设置一个标签字符串:"???刚买了:伪装套件." 但是当我进行测试时,标签显示".just buy:Disguise Kit ???"?

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

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

Rob*_*ier 36

首先,阅读Cal Henderson的优秀"用Unicode理解双向(BIDI)文本"..

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

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

Objective-C的:

self.label.text = @"\u200e??? just bought: Disguise Kit.";
Run Code Online (Sandbox Code Playgroud)

迅速:

self.label.text = "\u{200E}??? just bought: Disguise Kit."
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我必须使用 \U200E(大写 U 和 E)才能从 Localizable.strings 文件在 Obj-C 中工作 (3认同)
  • 是的,U + 200F RIGHT-TO-LEFT MARK. (2认同)

gur*_*tor 5

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

\n\n
String.localizedStringWithFormat("%@ just bought: Disguise Kit.", "\xd8\xae\xd8\xae\xd8\xae")\n// "\xe2\x81\xa8\xd8\xae\xd8\xae\xd8\xae\xe2\x81\xa9 just bought: Disguise Kit."\n
Run Code Online (Sandbox Code Playgroud)\n\n

相比于:

\n\n
String(format: "%@ just bought: Disguise Kit.", "\xd8\xae\xd8\xae\xd8\xae")\n// ".just bought: Disguise Kit \xd8\xae\xd8\xae\xd8\xae"\n
Run Code Online (Sandbox Code Playgroud)\n\n

要查看 localizedStringWithFormat 正在做什么:

\n\n
let scalars = String.localizedStringWithFormat("%@ just bought: Disguise Kit.", "\xd8\xae\xd8\xae\xd8\xae")\n    .unicodeScalars.map { "U+\\(String(format: "%04X", $0.value))" }\nprint(scalars)\n// ["U+2068", "U+062E", "U+062E", "U+062E", "U+2069", "U+0020", ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

此功能是在WWDC 2016 会议 232 国际用户界面新增功能中引入的

\n