什么是在Swift中从单个字符串转换为ASCII值的最简单方法?

时间:2015-04-23 22:10:14

标签: swift string character ascii

我只想在Swift中获取单个字符串的ASCII值。这就是我目前正在做的事情:

var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97

但这太难看了。必须有一个更简单的方法。

14 个答案:

答案 0 :(得分:86)

编辑/更新Swift 5

在Swift 5中,您可以使用新的字符属性isASCIIasciiValue

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数字表示形式。


#1。使用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)

#2。使用let character: Character = "" print(character.asciiValue) //prints: nil 的{​​{1}}属性和Character的{​​{1}}属性

或者,您可以检查字符串的第一个字符是ASCII字符(使用isASCII的{​​{3}}属性),然后获取其第一个Unicode标量的数字表示形式(使用{ {1}}的{​​{3}}属性)。下面的Playground示例代码显示了如何进行操作:

Unicode.Scalar
value
Character