Mam kodowanie UTF-8 NSData
z serwera Windows i chcę przekonwertować go NSString
na iPhone'a. Ponieważ dane zawierają znaki (takie jak symbol stopnia), które mają różne wartości na obu platformach, w jaki sposób przekonwertować dane na ciąg?
567
Odpowiedzi:
Jeśli dane nie są zakończone zerem, należy użyć
-initWithData:encoding:
Jeśli dane są zakończone zerem, powinieneś zamiast tego użyć,
-stringWithUTF8String:
aby uniknąć dodatkowych\0
na końcu.(Zauważ, że jeśli wejście nie jest poprawnie zakodowane w UTF-8, otrzymasz
nil
.)Szybki wariant:
Jeśli dane są zakończone zerem, możesz przejść bezpieczną drogą, która polega na usunięciu znaku null lub niebezpieczną drogą podobną do powyższej wersji Objective-C.
źródło
Możesz wywołać tę metodę
źródło
NSData
wie, ile ma bajtów ...NSData
naNSString
(patrz odpowiedź Kenny'ego), jestem zaskoczony, że nie ma czegoś,+(id)stringWithUTF8Data:(NSData *)data
co po prostu działa.Pokornie przesyłam kategorię, aby było to mniej denerwujące:
i
(Pamiętaj, że jeśli nie używasz ARC, potrzebujesz
autorelease
.)Teraz zamiast przerażająco gadatliwego:
Możesz to zrobić:
źródło
Wersja Swift od String do Data iz powrotem do String:
Xcode 10.1 • Swift 4.2.1
Plac zabaw
źródło
Czasami metody z innych odpowiedzi nie działają. W moim przypadku generuję podpis za pomocą mojego prywatnego klucza RSA, a wynikiem jest NSData. Odkryłem, że to działa:
Cel C
Szybki
źródło
[[NSData alloc] initWithBase64EncodedString:signatureString options:0]
; Swift :NSData(base64EncodedString: str options: nil)
Podsumowując, oto pełna odpowiedź, która zadziałała dla mnie.
Mój problem polegał na tym, że kiedy używałem
Ciąg, który otrzymałem, był nieprzewidywalny: około 70% zawierało oczekiwaną wartość, ale zbyt często to powodowało
Null
a nawet gorzej: garbowany na końcu łańcucha.Po kopaniu przełączyłem się na
I za każdym razem uzyskałem oczekiwany wynik.
źródło
Swift z 5, można użyć
String
„sinit(data:encoding:)
inicjator w celu przekształceniaData
instancji doString
instancji przy użyciu UTF-8.init(data:encoding:)
ma następującą deklarację:Poniższy kod placu zabaw pokazuje, jak go używać:
źródło