在Swift中转换Character和CodePoint

时间:2014-06-08 01:29:50

标签: string swift

我可以直接在Swift Character和它的Unicode数值之间进行转换吗?那就是:

var i:Int = ...  // A plain integer index.
var myCodeUnit:UInt16 = myString.utf16[i]
// Would like to say myChar = myCodeUnit as Character, or equivalent.

...或

var j:String.Index = ... // NOT an integer!
var myChar:Character = myString[j]
// Would like to say myCodeUnit = myChar as UInt16

可以说:

myCodeUnit = String(myChar).utf16[0]

但这意味着为每个角色创建一个新的String。我这样做了数千次(解析文本),这是一个很多新的字符串,会立即被丢弃。

4 个答案:

答案 0 :(得分:4)

类型Character表示“Unicode字形集群”,可以是多个Unicode代码点。如果需要一个Unicode代码点,则应使用类型UnicodeScalar代替。

答案 1 :(得分:4)

根据快速书:

字符串到代码单元

要获取String的每个字符的codeunit / ordinals,您可以执行以下操作:

var yourSwiftString = "甲乙丙丁"
for scalar in yourSwiftString.unicodeScalars {
    print("\(scalar.value) ")
}

代码单位到字符串

因为快速电流没有办法将序数/代码单位转换回UTF,我发现的最好方法是仍然是NSString。即如果您有int序数(32位但代表21位代码点),您可以使用以下代码转换为Unicode:

var i = 22247
var unicode_str = NSString(bytes: &i, length: 4, encoding: NSUTF32LittleEndianStringEncoding)

显然,如果你想转换一组int,你需要先将它们打包成一个数组。

答案 2 :(得分:1)

我采访了一位正在研究Unicode的Apple工程师,他说他们还没有完成字符串中unicode字符的实现。您是在寻找代码单元还是完整字符?因为获得完整unicode字符的唯一正确方法是在字符串上使用for循环。即

for c in "hello" {
    // c is a unicode character of type Character
}

但是,到目前为止还没有实现。

答案 3 :(得分:-1)

我也有这个问题,我只想出了将Character转换为Unicode值的方法:

var char:Character = "a"
var unicodeValue = UnicodeScalar("a").value

还不知道如何将unicode值转换回Character。