NSString値をNSDataに変換するにはどうすればよいですか?


回答:


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

UTF-16やUTF-32などのより高いものとは対照的に、UTF-8を使用することの長所と短所は何ですか?
Albert Renshaw 2014年

4
NSDataは、UTF-8であるか、UTF-16であるか、UTF-32であるかをあまり気にしません。2つの問題があります。1つは、UTF-16とUTF-32は、正しいバイト順である必要があります。2つ目は、それをNSString *に戻す人は、エンコーディングを知っている必要があり、多くの場合、UTF-8エンコーディングを想定しています。一般に、UTF-8は正しく処理される可能性が高いです。
gnasher729 2014年

1
@bendytreeは実際にはそうではありません。-dataUsingEncoding:は、stringWithUTF8String:が必要とする、nullで終了していない文字列を返します。元に戻すのは、-initWithData:encoding:です。
サイコ

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
1つのライナーソリューション:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
ラプター

32

行う:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

その後、自由に続行してくださいNSJSONSerialization:JSONObjectWithData


NULLターミネーターに関する回答の修正

コメント、公式文書、および検証に続いて、この回答は、疑わしいNULLターミネーターの削除に関して更新されました。

  1. dataUsingEncoding:で文書化されているように

    戻り値

    dataUsingEncoding:allowLossyConversion:2番目の引数としてNOを使用して呼び出した結果

  2. getCString:maxLength:encoding:およびcStringUsingEncoding:で文書化されているように:

    によって返されるデータは、NULLターミネータを持たないdataUsingEncoding:allowLossyConversion:ため、厳密なC文字列ではないことに注意してください。


14
これは間違っています!こちらの投稿をご覧ください:stackoverflow.com/q/14087094/192819
jpswain

4
うん。dataUsingEncoding:nullで終了するデータを返しません。UTF8StringC文字列を返すメソッドのみがnullで終了する文字列を返します。
Peter Hosey

@PeterHoseyそのための情報源はありますか?どのドキュメントでもそれを見つけるのに苦労しています。
shortstuffsushi 2015年

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 2015

1
(疑問に思っている人のために:shortstuffsushiの引用は下にありcStringUsingEncoding:ます。私は下を見ていましたdataUsingEncoding:。)
Peter Hosey

20

Swift Developerがここに来る場合、

NSString / StringからNSDataに変換する

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

Objective-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、ちょうど渡すNSUnicodeStringEncoding代わりにNSUTF8StringEncoding、あなたにdataUsingEncoding:メッセージを。


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、バイト数ではなく、Unicode文字の数を示すためです。たとえば、strisの場合@"にほんご"str.length4がstr.UTF8String返されますが、実際には12バイトが含まれています。で置き換えstr.lengthても、のようにNULL文字strlen(str.UTF8String)str含まれている場合は、依然として正しくありません@"にほ\0んご"
2016

この方法で作成されたNSDataオブジェクトは、[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error]で使用すると例外をスローします。
Adobels 2017

2

Objective-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!


0

Objective-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.