从单个字符串转换为 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。使用 CharacterasciiValue 属性

Character 有一个 属性 叫做 asciiValueasciiValue 具有以下声明:

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。使用 CharacterisASCII 属性 和 Unicode.Scalarvalue 属性

作为替代方法,您可以检查字符串的第一个字符是否为 ASCII 字符(使用 CharacterisASCII 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]