我可以直接在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。我这样做了数千次(解析文本),这是一个很多新的字符串,会立即被丢弃。
答案 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。