programing

UTF-8 인코딩된 NSData를 NSString으로 변환

newsource 2023. 4. 15. 08:56

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에 인스턴스하다.StringUTF-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