从单个字符串转换为 Swift 中的 ASCII 值的最简单方法是什么?
What's the simplest way to convert from a single character String to an ASCII value in Swift?
我只想获取 Swift 中单个字符字符串的 ASCII 值。这就是我目前的做法:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
虽然这太难看了。一定有更简单的方法。
你可以使用 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
edit/update Swift 5.2 或更高版本
extension StringProtocol {
var asciiValues: [UInt8] { compactMap(\.asciiValue) }
}
"abc".asciiValues // [97, 98, 99]
在Swift5中可以使用新的角色属性isASCII and 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 { [=13=].isASCII }
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
var asciiValues: [UInt32] {
return compactMap { [=14=].ascii }
}
}
Character("a").isAscii // true
Character("a").ascii // 97
Character("á").isAscii // false
Character("á").ascii // nil
"abc".asciiValues // [97, 98, 99]
"abc".asciiValues[0] // 97
"abc".asciiValues[1] // 98
"abc".asciiValues[2] // 99
你的做法是对的。如果你不喜欢索引的冗长,你可以通过循环 unicode 标量来避免它:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
在这种情况下,您实际上可以省略 break
,当然,因为只有一个 unicode 标量。
或者,转成Array,使用Int索引(走投无路的不得已):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
一个稍微简短的方法可以是:
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
}
这是我的实现,它 returns 一个 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 兼容。
现在 Xcode 7.1 和 Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
UnicodeScalar("1")!.value // returns 49
Swift 3.1
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
Swift 4
print("c".utf8["c".utf8.startIndex])
或
let cu = "c".utf8
print(cu[cu.startIndex])
两者都打印 99。适用于任何 ASCII 字符。
UInt8 上还有 UInt8(ascii: Unicode.Scalar) 初始化器。
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
Swift 4.1
https://oleb.net/blog/2017/11/swift-4-strings/
let flags = "99_problems"
flags.unicodeScalars.map {
"\(String([=10=].value, radix: 16, uppercase: true))"
}
结果:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
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
Swift 4+
字符转 ASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCII 转字符
let char = Character(UnicodeScalar(asciiVal)!)
使用 Swift 5,您可以选择以下方法之一来获取字符的 ASCII 数字表示形式。
#1。使用 Character
的 asciiValue
属性
Character
有一个 属性 叫做 asciiValue
。 asciiValue
具有以下声明:
var asciiValue: UInt8? { get }
The ASCII encoding value of this character, if it is an ASCII character.
以下 Playground 示例代码展示了如何使用 asciiValue
来获得
字符的ASCII编码值:
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
#2。使用 Character
的 isASCII
属性 和 Unicode.Scalar
的 value
属性
作为替代方法,您可以检查字符串的第一个字符是否为 ASCII 字符(使用 Character
的 isASCII
property) then get the numeric representation of its first Unicode scalar (using Unicode.Scalar
's value
属性)。下面的 Playground 示例代码显示了如何进行:
let character: Character = "a"
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let string = "a"
if let character = string.first, character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let character: Character = ""
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: Not an ASCII character
*/
var input = "Swift".map {
字符(扩展GraphemeClusterLiteral:$ 0).asciiValue!
}
// [83, 119, 105, 102, 116]
我只想获取 Swift 中单个字符字符串的 ASCII 值。这就是我目前的做法:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
虽然这太难看了。一定有更简单的方法。
你可以使用 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
edit/update Swift 5.2 或更高版本
extension StringProtocol {
var asciiValues: [UInt8] { compactMap(\.asciiValue) }
}
"abc".asciiValues // [97, 98, 99]
在Swift5中可以使用新的角色属性isASCII and 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 { [=13=].isASCII }
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
var asciiValues: [UInt32] {
return compactMap { [=14=].ascii }
}
}
Character("a").isAscii // true
Character("a").ascii // 97
Character("á").isAscii // false
Character("á").ascii // nil
"abc".asciiValues // [97, 98, 99]
"abc".asciiValues[0] // 97
"abc".asciiValues[1] // 98
"abc".asciiValues[2] // 99
你的做法是对的。如果你不喜欢索引的冗长,你可以通过循环 unicode 标量来避免它:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
在这种情况下,您实际上可以省略 break
,当然,因为只有一个 unicode 标量。
或者,转成Array,使用Int索引(走投无路的不得已):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
一个稍微简短的方法可以是:
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
}
这是我的实现,它 returns 一个 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 兼容。
现在 Xcode 7.1 和 Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
UnicodeScalar("1")!.value // returns 49
Swift 3.1
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
Swift 4
print("c".utf8["c".utf8.startIndex])
或
let cu = "c".utf8
print(cu[cu.startIndex])
两者都打印 99。适用于任何 ASCII 字符。
UInt8 上还有 UInt8(ascii: Unicode.Scalar) 初始化器。
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
Swift 4.1
https://oleb.net/blog/2017/11/swift-4-strings/
let flags = "99_problems"
flags.unicodeScalars.map {
"\(String([=10=].value, radix: 16, uppercase: true))"
}
结果:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
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
Swift 4+
字符转 ASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCII 转字符
let char = Character(UnicodeScalar(asciiVal)!)
使用 Swift 5,您可以选择以下方法之一来获取字符的 ASCII 数字表示形式。
#1。使用 Character
的 asciiValue
属性
Character
有一个 属性 叫做 asciiValue
。 asciiValue
具有以下声明:
var asciiValue: UInt8? { get }
The ASCII encoding value of this character, if it is an ASCII character.
以下 Playground 示例代码展示了如何使用 asciiValue
来获得
字符的ASCII编码值:
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
#2。使用 Character
的 isASCII
属性 和 Unicode.Scalar
的 value
属性
作为替代方法,您可以检查字符串的第一个字符是否为 ASCII 字符(使用 Character
的 isASCII
property) then get the numeric representation of its first Unicode scalar (using Unicode.Scalar
's value
属性)。下面的 Playground 示例代码显示了如何进行:
let character: Character = "a"
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let string = "a"
if let character = string.first, character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let character: Character = ""
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: Not an ASCII character
*/
var input = "Swift".map { 字符(扩展GraphemeClusterLiteral:$ 0).asciiValue! }
// [83, 119, 105, 102, 116]