如果您对Mongolian的细节不感兴趣,但只想快速回答有关在Swift中使用和转换Unicode值的问题,请跳到接受答案的第一部分.
我想渲染传统蒙古语的 Unicode文本,以便在iOS应用程序中使用.更好和长期的解决方案是使用AAT智能字体来渲染这个复杂的脚本.(这些字体确实存在,但它们的许可证不允许修改和非个人使用.)但是,由于我从未制作过字体,更不用说AAT字体的所有渲染逻辑了,我只是打算自己进行渲染.斯威夫特现在.也许在以后我可以学习制作智能字体.
在外部我将使用Unicode文本,但在内部(在a中显示UITextView)我将Unicode转换为以哑字体存储的单个字形(用Unicode PUA值编码).所以我的渲染引擎需要将蒙古语Unicode值(范围:U + 1820到U + 1842)转换为存储在PUA中的字形值(范围:U + E360到U + E5CF).无论如何,这是我的计划,因为它是我过去在Java中所做的,但也许我需要改变我的整个思维方式.
下图显示su在蒙古语中使用两种不同形式的字母u(红色)两次写入.(蒙古文是垂直书写的,字母连接像英文草书一样.)

在Unicode中,这两个字符串将表示为
var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"
Run Code Online (Sandbox Code Playgroud)
自由变量选择器(U + 180B)in suForm2被Swift识别(正确)String为与其前面的u(U + 1826)的单位.Swift认为它是一个单一的字符,一个扩展的字形集群.但是,为了自己进行渲染,我需要将u(U + 1826)和FVS1(U + 180B)区分为两个不同的UTF-16代码点.
出于内部显示的目的,我将上述Unicode字符串转换为以下呈现的字形字符串:
suForm1 = "\u{E46F}\u{E3BA}"
suForm2 = "\u{E46F}\u{E3BB}"
Run Code Online (Sandbox Code Playgroud)
我一直在玩Swift String和Character.关于它们有很多方便的东西,但是因为在我的特殊情况下我只使用UTF-16代码单元,我想知道我是否应该使用旧的NSString而不是Swift的String.我意识到我可以String.utf16 …
如何在Character不先将其转换为String?的情况下提取给定的Unicode代码点?我知道我可以使用以下内容:
let ch: Character = "A"
let s = String(ch).unicodeScalars
s[s.startIndex].value // returns 65
Run Code Online (Sandbox Code Playgroud)
但似乎应该有一个更直接的方法来完成这个使用Swift的标准库.语言指南"使用字符"和"Unicode"部分仅讨论迭代a中的字符String,而不是直接使用Characters.
我对这个问题感到非常愚蠢,但文档和谷歌都没有给我任何爱.
我有一个Unicode字符,我想插入我的iPhone应用程序的源代码中的字符串文字.我知道它的十六进制值.什么是适当的转义序列?就此而言,我忽略了哪些明显的信息来源会告诉我这个?
我挣扎,未能超过十分钟在这里,我放弃.我需要一个Int转换为斯威夫特一个字符并不能解决它.
题
你如何在Swift中转换(强制转换)Int(整数)到Character(char)?
说明性问题/任务挑战
生成一个for循环,打印字母'A'到'Z',例如:
for(var i:Int=0;i<26;i++) { //Important to note - I know
print(Character('A' + i)); //this is horrendous syntax...
} //just trying to illustrate! :)
Run Code Online (Sandbox Code Playgroud) 这是一篇非常好的文章,它引用了iOS表情符号及其代码.例如\ue008对于小型相机.
我在我的代码中试过这个:
var myText: String = "\ue008"
Run Code Online (Sandbox Code Playgroud)
xCode不接受此操作.如何包含它?
我有一个unicode角色
\u{0D85}.我如何从中获得Int价值?
我打算将它们引用到另一个Stack Overflow Q&A,但我找不到一个.这些是指转换另一个方向:
这些似乎是在询问如何将字符串形式的数字转换为实际数字Int(如转换"1"为1).
我将在下面提供一个答案,而不是试图将我的答案放在对提问者的评论中.类型\u{0D85}有点不清楚,但我将涵盖各种可能性.
我需要一种方法将包含表示十六进制值的文字字符串的字符串转换为对应于该特定十六进制值的字符.
理想情况下,沿着这些方向:
let hexString: String = "2C"
let char: Character = fromHexString(hexString)
println(char) // prints -> ","
Run Code Online (Sandbox Code Playgroud)
我试过使用语法:"\ u {n}"其中n是Int或String,但都不起作用.
这可以用来循环遍历一个hexStrings数组,如下所示:
var hexArray = ["2F", "24", "40", "2A"]
var charArray = [Character]()
charArray = map(hexArray) { charArray.append(Character($0)) }
charArray.description // prints -> "[/, $, @, *]"
Run Code Online (Sandbox Code Playgroud) 以下示例取自字符串和字符文档:

值55357(U+D83D十六进制)和56374(U+DC36十六进制)是形成Unicode标量的代理对U+1F436,即DOG FACE字符.有没有办法走向另一个方向?也就是说,我可以将代理对转换为标量吗?
我试过了
let myChar: Character = "\u{D83D}\u{DC36}"
Run Code Online (Sandbox Code Playgroud)
但是我收到了"无效的Unicode标量"错误.
这个Objective C答案和这个项目似乎是自定义解决方案,但Swift(尤其是Swift 2.0+)中是否有任何内容可以做到这一点?
阅读文档和这个答案,我看到我可以通过以下任一方式初始化Unicode字符:
let narrowNonBreakingSpace: Character = "\u{202f}"
let narrowNonBreakingSpace = "\u{202f}"
Run Code Online (Sandbox Code Playgroud)
据我所知,第二个实际上是一个字符串.与Java不同,它们都使用双引号(而不是单引号).不过,我已经看过几个例子,Character即使变量只包含一个字符,也会使用第二种形式(不使用).那些人只是懒惰还是忘记写作Character?或者Swift会处理所有细节,我不需要为此烦恼吗?如果我知道我有一个只包含一个Unicode值的常量,我应该总是使用Character吗?