Je veux juste obtenir la valeur ASCII d'une seule chaîne de caractères dans Swift. Voici comment je le fais actuellement:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
C'est si moche cependant. Il doit y avoir un moyen plus simple.
Vous pouvez créer une extension:
Swift 4 ou plus tard
extension Character {
var isAscii: Bool {
return unicodeScalars.first?.isASCII == true
}
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
UnicodeScalar("1")!.value // returns 49
Swift 3.1
Maintenant dans Xcode 7.1 et Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
Vous pouvez utiliser characterAtIndex de NSString pour y parvenir ...
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
Voici mon implémentation, elle retourne un tableau des valeurs ASCII.
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
Remarque: oui, il est compatible Swift 2.
Une façon un peu plus courte de faire cela pourrait être:
first(singleChar.unicodeScalars)!.value
Comme avec la version en indice, cela plantera si votre chaîne est réellement vide. Si vous n’êtes pas sûr à 100%, utilisez l’option facultative:
if let ascii = first(singleChar.unicodeScalars)?.value {
}
Ou, si vous voulez être extra-paranoïaque,
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
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))"
}
Résultat:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
Swift 4.2
Le moyen le plus simple d'obtenir les valeurs ASCII d'une chaîne Swift est ci-dessous
let str = "Swift string"
for ascii in str.utf8 {
print(ascii)
}
Sortie:
83
119
105
102
116
32
115
116
114
105
110
103
La façon dont vous le faites est juste. Si vous n'aimez pas la verbosité de l'indexation, vous pouvez l'éviter en parcourant les scalaires Unicode:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
Dans ce cas, vous pouvez bien sûr omettre la variable break
, car il n’existe qu’un seul scalaire unicode.
Ou bien, convertissez-vous en un tableau et utilisez l'indexation Int (le dernier recours du désespéré):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
Il y a aussi l'initialiseur UInt8 (ascii: Unicode.Scalar) sur UInt8.
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
Swift 4+
Char en ASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCII à Char
let char = Character(UnicodeScalar(asciiVal)!)
Swift 4
print("c".utf8["c".utf8.startIndex])
ou
let cu = "c".utf8
print(cu[cu.startIndex])
Les deux imprimer 99. Fonctionne pour tout caractère ASCII.
Avec Swift 5, vous pouvez choisir l’une des approches suivantes pour obtenir la représentation numérique ASCII d’un caractère.
Character
's asciiValue
Character
a une propriété appelée asciiValue
. asciiValue
a la déclaration suivante:
var asciiValue: UInt8? { get }
La valeur de codage ASCII de ce caractère, s'il s'agit d'un caractère ASCII.
Les exemples de code suivants de Playground montrent comment utiliser asciiValue
afin d'obtenir La valeur de codage ASCII d'un caractère:
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
Character
's isASCII
et de la propriété Unicode.Scalar
' s value
Sinon, vous pouvez vérifier que le premier caractère d'une chaîne est un caractère ASCII (en utilisant Character
's isASCII
property), puis obtenir la représentation numérique de son premier scalaire Unicode (en utilisant Unicode.Scalar
's value
propriété). L'exemple de code Playground ci-dessous montre comment procéder:
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
*/