una tabla letras imprimir especiales dev convertir como codigo caracteres caracter cadena swift string character ascii

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