首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Xcode中,如何显示合并English+Arabic并以阿拉伯语开头的文本?

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

Stack Overflow用户
提问于 2012-09-11 17:08:46
回答 3查看 7.4K关注 0票数 15

我想为字符串设置一个标签:"خخخ刚刚购买:伪装工具包。“但是当我运行测试时,标签显示".just购买:伪装工具包خخخ"?

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-28 10:52:40

首先,请阅读卡尔·亨德森的优秀"Understanding Bidirectional (BIDI) Text in Unicode."

信不信由你,UILabel正在按照你要求的方式进行布局。您提供了一个从右到左的字符串(从阿拉伯语开始)。它开始从右到左显示。然后嵌入一个从左到右的英文字符串,该字符串从左到右排列。然后它会看到句号,并从右到左排列,因为这是一个阿拉伯字符串,其中恰好有一些英语(正如最佳UILabel所能看出的那样)。

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

Objective-C:

代码语言:javascript
复制
self.label.text = @"\u200eكتب just bought: Disguise Kit.";

Swift:

代码语言:javascript
复制
self.label.text = "\u{200E}كتب just bought: Disguise Kit."

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

还有几件事需要注意:永远不要用ككك测试这个东西,一定要用كتب(像每个好学生一样:D)或者更好的像الو这样的东西来测试。否则,你就不能分辨出什么时候阿拉伯语是向后排列的。我喜欢الو,因为它看起来非常不同。

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

请务必参阅iOS 10+/MacOS10.12中添加的有用的相关特性的guru_meditator的answer

票数 43
EN

Stack Overflow用户

发布于 2019-04-08 17:15:20

从Unicode10(和macOS 10.12)开始,String localizedStringWithFormat在占位符周围插入iOS隔离。这是一种使用混合语言方向格式化字符串的较高级别方法,无需手动插入方向标记。

代码语言:javascript
复制
String.localizedStringWithFormat("%@ just bought: Disguise Kit.", "خخخ")
// "⁨خخخ⁩ just bought: Disguise Kit."

请比较:

代码语言:javascript
复制
String(format: "%@ just bought: Disguise Kit.", "خخخ")
// ".just bought: Disguise Kit خخخ"

要查看localizedStringWithFormat正在做什么,请执行以下操作:

代码语言:javascript
复制
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中引入的

票数 4
EN

Stack Overflow用户

发布于 2020-04-29 23:22:36

实际上,\u{200E} (或任何)符号可以插入到字符串文字中。

  1. 添加"Unicode十六进制输入“(系统首选项->键盘->输入源-> + -> Unicode十六进制输入)。文本编辑器中的
  2. 将光标移动到要插入符号的位置。
  3. 将输入源切换到"Unicode十六进制输入”。
  4. 按住Option键并键入200E。
  5. 应插入符号,且字符串应与预期的一样。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12366330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档