我只想在Swift中获取单个字符串的ASCII值。这就是我目前正在做的事情:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
但这太难看了。必须有一个更简单的方法。
答案 0 :(得分:86)
编辑/更新Swift 5
在Swift 5中,您可以使用新的字符属性isASCII和asciiValue
Character("a").isASCII // true
Character("a").asciiValue // 97
Character("á").isASCII // false
Character("á").asciiValue // nil
旧答案
您可以创建扩展程序:
Swift 4.2或更高版本
extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { $0.isASCII }
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
var ascii: [UInt32] {
return compactMap { $0.ascii }
}
}
Character("a").isAscii // true
Character("a").ascii // 97
Character("á").isAscii // false
Character("á").ascii // nil
"abc".ascii // [97, 98, 99]
"abc".ascii[0] // 97
"abc".ascii[1] // 98
"abc".ascii[2] // 99
答案 1 :(得分:12)
UnicodeScalar("1")!.value // returns 49
Swift 3.1
答案 2 :(得分:10)
你可以使用NSString的characterAtIndex来完成这个......
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
答案 3 :(得分:10)
现在在Xcode 7.1和Swift 2.1中
var singleChar = "a"
singleChar.unicodeScalars.first?.value
答案 4 :(得分:3)
执行此操作的稍微简短的方法可能是:
first(singleChar.unicodeScalars)!.value
与下标版本一样,如果您的字符串实际为空,这将会崩溃,因此如果您不是100%确定,请使用可选:
if let ascii = first(singleChar.unicodeScalars)?.value {
}
或者,如果你想成为偏执狂,
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
答案 5 :(得分:3)
这是我的实现,它返回一个ASCII值数组。
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
注意:是的,它与Swift 2兼容。
答案 6 :(得分:3)
Swift 4.2
从Swift字符串获取ASCII值的最简单方法是在下面
let str = "Swift string"
for ascii in str.utf8 {
print(ascii)
}
输出:
83
119
105
102
116
32
115
116
114
105
110
103
答案 7 :(得分:2)
你这样做的方式是正确的。如果您不喜欢索引的详细程度,可以通过循环遍历unicode标量来避免它:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
当然,在这种情况下你可以省略break
,因为只有一个unicode标量。
或者,转换为数组并使用Int索引(绝望的最后手段):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
答案 8 :(得分:2)
Swift 4.1
https://oleb.net/blog/2017/11/swift-4-strings/
let flags = "99_problems"
flags.unicodeScalars.map {
"\(String($0.value, radix: 16, uppercase: true))"
}
结果:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
答案 9 :(得分:1)
<property name="public" column="IS_PUBLIC" type="yes_no" formula="case when IS_PUBLIC is NULL then 'N' else IS_PUBLIC end"/>
Swift 3.1
答案 10 :(得分:1)
UInt8上还有UInt8(ascii:Unicode.Scalar)初始化程序。
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
答案 11 :(得分:0)
Swift 4
print("c".utf8["c".utf8.startIndex])
或
let cu = "c".utf8
print(cu[cu.startIndex])
两者都打印99.适用于任何ASCII字符。
答案 12 :(得分:0)
快速4 +
字符为ASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCII到Char
let char = Character(UnicodeScalar(asciiVal)!)
答案 13 :(得分:0)
使用Swift 5,您可以选择以下一种方法来获取字符的ASCII数字表示形式。
Character
的{{1}}属性 asciiValue
具有一个名为asciiValue
的属性。 Character
具有以下声明:
asciiValue
此字符的ASCII编码值(如果是ASCII字符)。
以下Playground示例代码展示了如何使用var asciiValue: UInt8? { get }
来获取
字符的ASCII编码值:
asciiValue
let character: Character = "a"
print(character.asciiValue) //prints: Optional(97)
let string = "a"
print(string.first?.asciiValue) //prints: Optional(97)
let character: Character = ""
print(character.asciiValue) //prints: nil
的{{1}}属性和Character
的{{1}}属性或者,您可以检查字符串的第一个字符是ASCII字符(使用isASCII
的{{3}}属性),然后获取其第一个Unicode标量的数字表示形式(使用{ {1}}的{{3}}属性)。下面的Playground示例代码显示了如何进行操作:
Unicode.Scalar
value
Character