如果您对蒙古语的细节不感兴趣,而只是想快速了解在Swift中使用和转换Unicode值,那么请跳至已接受答案的第一部分。
背景
我要为iOS应用程序中使用的传统蒙古语呈现Unicode文本。更好的长期解决方案是使用AAT智能字体来呈现此复杂脚本。(确实存在这样的字体,但是它们的许可证不允许修改和非个人使用。)但是,由于我从未制作过字体,更不用说AAT字体的所有渲染逻辑了,我只打算自己进行渲染。斯威夫特暂时。也许以后我可以学习制作智能字体。
在外部,我将使用Unicode文本,但在内部(以显示为UITextView),我将Unicode转换为以哑字体(用Unicode PUA值编码)存储的单个字形。因此,我的渲染引擎需要将蒙古Unicode值(范围:U + 1820到U + 1842)转换为存储在PUA中的字形值(范围:U + E360到U + E5CF)。无论如何,这是我的计划,因为这是我过去在Java中所做的,但是也许我需要改变整体思维方式。
例
下图显示了使用两种不同形式的字母u(用红色)在蒙古语中写过su两次。(蒙古语是垂直书写的,字母像草书字母一样用英语连接。)
在此处输入图片说明
在Unicode中,这两个字符串将表示为
var suForm1: String = "\u{1830}\u{1826}"
var suForm2: String = "\u{1830}\u{1826}\u{180B}"
suForm2Swift 将自由变体选择器(U + 180B)识别(正确)为在其前面String带有u(U + 1826)的单元。Swift将其视为单个字符,扩展的字素簇。但是,出于自己进行渲染的目的,我需要将u(U + 1826)和FVS1(U + 180B)区分为两个不同的UTF-16代码点。
为了内部显示,我将上述Unicode字符串转换为以下呈现的字形字符串:
suForm1 = "\u{E46F}\u{E3BA}"
suForm2 = "\u{E46F}\u{E3BB}"
题
我一直在和Swift String和Character。关于它们有很多方便的事情,但是由于在我的特殊情况下,我只处理UTF-16代码单元,所以我想知道是否应该使用旧的NSString而不是Swift的代码String。我意识到我可以String.utf16用来获取UTF-16代码点,但是转换回String并不是很好。
坚持使用String和Character还是应该使用NSString和更好unichar?
素胚勾勒不出你
HUWWW