我的理解是,unichar
是UInt16
的一個typealias。 A unichar
只是一個數字。
我認爲你面臨的問題是Swift中的Character
可能由多個unicode「字符」組成。因此,它不能被轉換爲單個值,因爲它可能由兩個unichars組成。您可以通過其強制轉換爲字符串並使用utf16
屬性,這樣一個分解成Character
其個人unichar
值:
let c: Character = "a"
let s = String(c)
var codeUnits = [unichar]()
for codeUnit in s.utf16 {
codeUnits.append(codeUnit)
}
這將產生一個數組 - codeUnits
- unichar
值。
編輯:初始代碼有for codeUnit in s
時,它應該是for codeUnit in s.utf16
你可以收拾東西和測試爲每個unichar
值是否是在一個字符集是這樣的:
let char: Character = "\u{63}\u{20dd}" // This is a 'c' inside of an enclosing circle
for codeUnit in String(char).utf16 {
if NSCharacterSet(charactersInString: "c").characterIsMember(codeUnit) {
dude.abide()
} // dude will abide() for codeUnits[0] = "c", but not for codeUnits[1] = 0x20dd (the enclosing circle)
}
或者,如果您只對第一個(通常只有)unichar
值有興趣:
if NSCharacterSet(charactersInString: "c").characterIsMember(String(char).utf16[0]) {
dude.abide()
}
或者,在一個函數把它包:
func isChar(char: Character, inSet set: NSCharacterSet) -> Bool {
return set.characterIsMember(String(char).utf16[0])
}
let xSet = NSCharacterSet(charactersInString: "x")
isChar("x", inSet: xSet) // This returns true
isChar("y", inSet: xSet) // This returns false
現在做出功能檢查中的一個組成字符的所有unichar
值 - 這樣一來,如果你有一個組合字符,該函數將只返回如果屬實這兩個基本字符和組合字符存在:
func isChar(char: Character, inSet set: NSCharacterSet) -> Bool {
var found = true
for ch in String(char).utf16 {
if !set.characterIsMember(ch) { found = false }
}
return found
}
let acuteA: Character = "\u{e1}" // An "a" with an accent
let acuteAComposed: Character = "\u{61}\u{301}" // Also an "a" with an accent
// A character set that includes both the composed and uncomposed unichar values
let charSet = NSCharacterSet(charactersInString: "\u{61}\u{301}\u{e1}")
isChar(acuteA, inSet: charSet) // returns true
isChar(acuteAComposed, inSet: charSet) // returns true (both unichar values were matched
的最後一個版本是非常重要的。如果您的Character
是一個組成字符,您必須檢查字符集中是否存在基本字符(「a」)和組合字符(尖銳重音),否則您將得到誤報。
這是非常有趣的。它不能完全解決我的問題,所以我不能將其標記爲答案,但它確實解釋了爲什麼沒有直接的'Character' - >'unichar'。 –
我細化了我的答案。注意亞光的答案,而檢查非組成字符的好方法可能不適用於組成字符。 –
我仍在消化這一點。迷人。 –