UTF-8 인코딩된 NSData를 NSString으로 변환
UTF-8 인코딩 완료NSData
변환하고 싶다NSString
(iPhone용)데이터에는 두 플랫폼 모두에서 값이 다른 문자(도 기호 등)가 포함되어 있으므로 데이터를 문자열로 변환하려면 어떻게 해야 합니까?
데이터가 null-termination되지 않은 경우 다음을 사용해야 합니다.-initWithData:encoding:
NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
데이터가 null-termination된 경우 대신 다음을 사용해야 합니다.-stringWithUTF8String:
호외를 피하다\0
마지막에.
NSString* newStr = [NSString stringWithUTF8String:[theData bytes]];
(입력된 UTF-8 인코딩이 적절하지 않은 경우,nil
.)
스위프트 바리안트:
let newStr = String(data: data, encoding: .utf8)
// note that `newStr` is a `String?`, not a `String`.
데이터가 늘 종단된 경우 해당 늘 문자를 삭제하는 안전한 방법 또는 위의 Objective-C 버전과 유사한 안전하지 않은 방법을 사용할 수 있습니다.
// safe way, provided data is \0-terminated
let newStr1 = String(data: data.subdata(in: 0 ..< data.count - 1), encoding: .utf8)
// unsafe way, provided data is \0-terminated
let newStr2 = data.withUnsafeBytes(String.init(utf8String:))
이 방법이라고 할 수 있습니다.
+(id)stringWithUTF8String:(const char *)bytes.
번거로움을 덜기 위해 겸허하게 카테고리를 제출합니다.
@interface NSData (EasyUTF8)
// Safely decode the bytes into a UTF8 string
- (NSString *)asUTF8String;
@end
그리고.
@implementation NSData (EasyUTF8)
- (NSString *)asUTF8String {
return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}
@end
(ARC를 사용하지 않는 경우,autorelease
거기)
이제 섬뜩할 정도로 장황한 말 대신:
NSData *data = ...
[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
다음 작업을 수행할 수 있습니다.
NSData *data = ...
[data asUTF8String];
String에서 Data로, 그리고 String으로 돌아가는 Swift 버전:
Xcode 10.1 • Swift 4.2.1
extension Data {
var string: String? {
return String(data: self, encoding: .utf8)
}
}
extension StringProtocol {
var data: Data {
return Data(utf8)
}
}
extension String {
var base64Decoded: Data? {
return Data(base64Encoded: self)
}
}
놀이터.
let string = "Hello World" // "Hello World"
let stringData = string.data // 11 bytes
let base64EncodedString = stringData.base64EncodedString() // "SGVsbG8gV29ybGQ="
let stringFromData = stringData.string // "Hello World"
let base64String = "SGVsbG8gV29ybGQ="
if let data = base64String.base64Decoded {
print(data) // 11 bytes
print(data.base64EncodedString()) // "SGVsbG8gV29ybGQ="
print(data.string ?? "nil") // "Hello World"
}
let stringWithAccent = "Olá Mundo" // "Olá Mundo"
print(stringWithAccent.count) // "9"
let stringWithAccentData = stringWithAccent.data // "10 bytes" note: an extra byte for the acute accent
let stringWithAccentFromData = stringWithAccentData.string // "Olá Mundo\n"
다른 답변의 방법이 작동하지 않을 수 있습니다.제 경우 RSA 개인 키를 사용하여 서명을 생성하면 NSData가 생성됩니다.이 방법이 효과가 있는 것 같습니다.
목표-C
NSData *signature;
NSString *signatureString = [signature base64EncodedStringWithOptions:0];
재빠르다
let signatureString = signature.base64EncodedStringWithOptions(nil)
요약하자면, 여기 완전한 답이 있습니다. 제게는 효과가 있었습니다.
내 문제는 내가 이걸 썼을 때
[NSString stringWithUTF8String:(char *)data.bytes];
내가 얻은 문자열은 예측할 수 없었다.약 70%가 기대치를 포함하고 있었지만, 너무 많은 경우 다음과 같은 결과를 초래했습니다.Null
심지어 더 나쁜 것도 있어요. 끈 끝에 차고지.
좀 파헤친 후에, 나는 다른 곳으로 갈아탔다.
[[NSString alloc] initWithBytes:(char *)data.bytes length:data.length encoding:NSUTF8StringEncoding];
그리고 매번 예상된 결과를 얻었다.
Swift 5에서는String
를 변환하기 위한 이니셜라이저Data
에 인스턴스하다.String
UTF-8을 사용한 인스턴스init(data:encoding:)
에는 다음 선언이 있습니다.
init?(data: Data, encoding: String.Encoding)
a를 반환한다.
String
지정된 인코딩을 사용하여 지정된 데이터를 Unicode 문자로 변환하여 초기화됩니다.
다음 Playground 코드는 사용 방법을 보여 줍니다.
import Foundation
let json = """
{
"firstName" : "John",
"lastName" : "Doe"
}
"""
let data = json.data(using: String.Encoding.utf8)!
let optionalString = String(data: data, encoding: String.Encoding.utf8)
print(String(describing: optionalString))
/*
prints:
Optional("{\n\"firstName\" : \"John\",\n\"lastName\" : \"Doe\"\n}")
*/
언급URL : https://stackoverflow.com/questions/2467844/convert-utf-8-encoded-nsdata-to-nsstring
'programing' 카테고리의 다른 글
기존 테이블에서 테이블(구조)을 작성합니다. (0) | 2023.04.20 |
---|---|
C# Excel Interop - 워크시트를 호출할 때 '게시' 대화 상자를 표시하지 않습니다.ExportAsFixedFormat (0) | 2023.04.15 |
를 사용하여 Windows 64비트플랫폼을 검출하는 방법인터넷? (0) | 2023.04.15 |
GitHub 저장소에 태그 만들기 (0) | 2023.04.15 |
복잡한 Excel 공식에 주석을 추가하는 방법 (0) | 2023.04.15 |