NSString 값을 NSData로 어떻게 변환합니까?


답변:


1419
NSString* str = @"teststring";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

UTF-16 또는 UTF-32와 같은 것과 달리 UTF-8을 사용할 때의 장단점은 무엇입니까?
Albert Renshaw

4
NSData는 UTF-8, UTF-16 또는 UTF-32인지에 대해서는 신경 쓰지 않습니다. 두 가지 문제점이 있습니다. 하나의 UTF-16과 UTF-32는 올바른 바이트 순서를 가져야합니다. 둘째, NSString *으로 다시 변환하는 사람은 인코딩을 알고 있어야하며 종종 UTF-8 인코딩을 가정합니다. 일반적으로 UTF-8은 올바르게 처리 될 가능성이 높습니다.
gnasher729

1
@bendytree 실제로는 그렇지 않습니다. -dataUsingEncoding : null로 끝나지 않은 문자열을 반환합니다. 다시 변환하는 것은 -initWithData : encoding :입니다.
Psycho

1
@Albert Renshaw는 현재 NSString내부적으로 UTF-16을 사용하므로 UTF-16 <-> UTF-8 변환을 수행 할 필요가 없기 때문에 약간의 성능 향상이있을 수 있습니다. 개인적으로 우리는 @ gnasher729가 제안한 바와 같이 성능보다 견고성을 선호하고 모든 곳에서 UTF-8을 사용합니다.
일부 개발자

66
NSString *str = @"helowrld";
// This converts the string to an NSData object
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

링크 에서 참조 할 수 있습니다


3
하나의 라이너 솔루션 :NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
랩터

32

하다:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

그런 다음 계속 진행하십시오 NSJSONSerialization:JSONObjectWithData.


NULL 종료 자 관련 답변 수정

의견, 공식 문서 및 검증 에 따라이 답변은 NULL 종결 자 제거와 관련하여 업데이트되었습니다.

  1. dataUsingEncoding에 의해 문서화 된 바와 같이 :

    반환 값

    dataUsingEncoding:allowLossyConversion:두 번째 인수로 NO 를 호출 한 결과

  2. getCString : maxLength : encoding :cStringUsingEncoding :에 의해 문서화되어 있습니다 .

    반환 된 데이터 는 NULL 종결자가 없기dataUsingEncoding:allowLossyConversion: 때문에 엄격한 C- 문자열 이 아닙니다.


14
이것은 잘못입니다! 여기에 내 게시물을 참조하십시오 stackoverflow.com/q/14087094/192819
jpswain

4
예. dataUsingEncoding:널 종료 데이터를 리턴하지 않습니다. UTF8StringC 문자열을 반환하는 다른 메서드 만 null로 끝나는 문자열을 반환합니다.
Peter Hosey

@PeterHosey 그에 대한 소스가 있습니까? 나는 문서에서 그것을 찾는 데 어려움을 겪고 있습니다.
shortstuffsushi

1
덕분에 @PeterHosey, 워드 프로세서 당신이 연결 않는 명시 적으로 NULL 종료의 부족 상태 - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator). 나는 이것을 일찍 놓쳤다. 그래도 앞으로 아무 것도 쓰지 않겠습니다.
shortstuffsushi

1
(궁금있어 누군가를 위해 : shortstuffsushi의 견적을 받고있다 cStringUsingEncoding:내가에서 찾고 있었다. dataUsingEncoding:.)
피터 Hosey

20

스위프트 개발자가 여기 오면

NSString / String에서 NSData로 변환

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

목표 -C :

NSString *str = @"test string";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

빠른:

let str = "test string"
let data = NSKeyedArchiver.archivedData(withRootObject: str)
let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String

다른 방법에 비해 프로세서를 많이 사용하지만 지속성을 위해 파일 시스템에 액세스하는 경우 매우 유용합니다.
Stephen J

10

먼저, dataUsingEncoding:대신 에을 사용해야 합니다 UTF8String. 해당 인코딩에 문자열 UTF8String이 필요한 경우 에만 사용하십시오 C.

그런 다음 메시지 대신 메시지를 UTF-16전달 하십시오 .NSUnicodeStringEncodingNSUTF8StringEncodingdataUsingEncoding:


7

Swift 3의 경우 주로에서로 변환 String됩니다 Data.

let myString = "test"
let myData = myString.data(using: .utf8)
print(myData) // Optional(Data)

6
NSString *str = @"hello";
NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];

5
이 대답은 str127보다 큰 코드 포인트를 포함하는 경우 잘못된 것입니다. str.length바이트 수가 아닌 유니 코드 문자 수를 제공 하기 때문 입니다. 예를 들어, str이다 @"にほんご", str.length반면 4를 제공 str.UTF8String실제로 12 바이트가 포함되어 있습니다. 당신이 교체 되더라도 str.length으로 strlen(str.UTF8String), 여전히 사건에 대한 잘못 될 것 str같은 NULL 문자를 포함 @"にほ\0んご".
Pang

이 방식으로 생성 된 NSData 객체는 [NSJSONSerialization JSONObjectWithData : data 옵션 : NSJSONReadingMutableLeaves error : & error];와 함께 사용할 때 실행을 throw합니다.
Adobels

2

목표 -C :

NSString에서 NSData로 :

NSString* str= @"string";
NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];

NSData에서 NSString으로 :

NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

빠른:

문자열을 데이터로 :

var testString = "string"
var somedata = testString.data(using: String.Encoding.utf8)

데이터를 문자열로 :

var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!

1
NSString *str = @"Banana";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];

0

목표 -C

NSString *str = @"Hello World";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];

빠른

let str = "Hello World"
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.