swift - tabla - imprimir codigo ascii en dev c++
¿Cuál es la forma más sencilla de convertir una cadena de un solo carácter a un valor ASCII en Swift? (14)
Ahora en Xcode 7.1 y Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
Solo quiero obtener el valor ASCII de una sola cadena de caracteres en Swift. Así es como lo estoy haciendo actualmente:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
Sin embargo, esto es tan feo. Debe haber una manera más simple.
Aquí está mi implementación, devuelve una matriz de valores ASCII.
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
Nota: Sí, es compatible con Swift 2.
Con Swift 5, puede elegir uno de los siguientes enfoques para obtener la representación numérica ASCII de un personaje.
# 1
Uso de la propiedad
asciiValue
del
asciiValue
Character
tiene una propiedad llamada
asciiValue
.
asciiValue
tiene la siguiente declaración:
var asciiValue: UInt8? { get }
El valor de codificación ASCII de este carácter, si es un carácter ASCII.
Los siguientes códigos de muestra de Playground muestran cómo usar
asciiValue
para obtener el valor de codificación ASCII de un personaje:
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
Uso de la propiedad
isASCII
del
isASCII
y la propiedad de
value
isASCII
Como alternativa, puede comprobar que el primer carácter de una cadena es un carácter ASCII (utilizando la propiedad
isASCII
) y luego obtener la representación numérica de su primer escalar Unicode (utilizando la propiedad de
value
Unicode.Scalar).
El siguiente código de muestra de Playground muestra cómo proceder:
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
*/
La forma en que lo haces es correcta. Si no le gusta la verbosidad de la indexación, puede evitarla recorriendo los escalares unicode:
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
En este caso, puede omitir la
break
, por supuesto, ya que solo hay un escalar unicode.
O bien, conviértase en una matriz y use la indexación Int (el último recurso de los desesperados):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
Puede usar characterAtIndex de NSString para lograr esto ...
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of /(singleCharString) is /(singleCharValue)") // The value of a is 97
Swift 4+
Char a ASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCII a Char
let char = Character(UnicodeScalar(asciiVal)!)
También está el inicializador UInt8 (ascii: Unicode.Scalar) en UInt8.
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
Una forma un poco más corta de hacerlo podría ser:
first(singleChar.unicodeScalars)!.value
Al igual que con la versión de subíndice, esto se bloqueará si su cadena está realmente vacía, por lo que si no está 100% seguro, use el opcional:
if let ascii = first(singleChar.unicodeScalars)?.value {
}
O, si quieres ser extra-paranoico,
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
Swift 4
print("c".utf8["c".utf8.startIndex])
o
let cu = "c".utf8
print(cu[cu.startIndex])
Ambos imprimen 99. Funciona para cualquier carácter ASCII.
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))"
}
Resultado:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
Swift 4.2
La forma más fácil de obtener valores ASCII de una cadena Swift está debajo
let str = "Swift string"
for ascii in str.utf8 {
print(ascii)
}
Salida:
83
119
105
102
116
32
115
116
114
105
110
103
editar / actualizar Swift 5
En Swift 5 puede usar las nuevas propiedades de caracteres isASCII y asciiValue
Character("a").isASCII // true
Character("a").asciiValue // 97
Character("á").isASCII // false
Character("á").asciiValue // nil
Vieja respuesta
Puedes crear una extensión:
Swift 4.2 o posterior
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
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
UnicodeScalar("1")!.value // returns 49
Swift 3.1