Tengo UTF-8 codificado NSData
desde el servidor de Windows y quiero convertirlo NSString
para iPhone. Dado que los datos contienen caracteres (como un símbolo de grado) que tienen valores diferentes en ambas plataformas, ¿cómo convierto los datos en cadenas?
567
Respuestas:
Si los datos no tienen terminación nula, debe usar
-initWithData:encoding:
Si los datos están terminados en nulo, debería utilizarlos
-stringWithUTF8String:
para evitar el extra\0
al final.(Tenga en cuenta que si la entrada no está correctamente codificada en UTF-8, obtendrá
nil
).Variante rápida:
Si los datos están terminados en nulo, puede ir de la manera segura que es eliminar ese carácter nulo, o la forma insegura similar a la versión de Objective-C anterior.
fuente
Podrías llamar a este método
fuente
NSData
sabe cuántos bytes tiene ...NSData
a unaNSString
(ver la respuesta de KennyTM), me sorprende que no haya una+(id)stringWithUTF8Data:(NSData *)data
que simplemente funcione.Presento humildemente una categoría para que esto sea menos molesto:
y
(Tenga en cuenta que si no está utilizando ARC, necesitará un
autorelease
allí).Ahora en lugar de lo terriblemente detallado:
Tu puedes hacer:
fuente
La versión Swift de String a Data y de regreso a String:
Xcode 10.1 • Swift 4.2.1
Patio de recreo
fuente
A veces, los métodos en las otras respuestas no funcionan. En mi caso, estoy generando una firma con mi clave privada RSA y el resultado es NSData. Descubrí que esto parece funcionar:
C objetivo
Rápido
fuente
[[NSData alloc] initWithBase64EncodedString:signatureString options:0]
; Swift :NSData(base64EncodedString: str options: nil)
Solo para resumir, aquí hay una respuesta completa, que funcionó para mí.
Mi problema era que cuando usaba
La cadena que obtuve fue impredecible: alrededor del 70% contenía el valor esperado, pero con demasiada frecuencia resultó con
Null
o incluso peor: basura al final de la cadena.Después de cavar un poco, cambié a
Y obtuvo el resultado esperado cada vez.
fuente
Con Swift 5, puede usar
String
elinit(data:encoding:)
inicializador para convertir unaData
instancia en unaString
instancia usando UTF-8.init(data:encoding:)
tiene la siguiente declaración:El siguiente código de Playground muestra cómo usarlo:
fuente