मैं NSData को NSString मान कैसे परिवर्तित करूं?


जवाबों:


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

UTF-16 या UTF-32 जैसी चीज़ों के विपरीत UTF-8 का उपयोग करने के पक्ष और विपक्ष क्या हैं?
अल्बर्ट रेनशॉ

4
NSData को इस बात की ज्यादा परवाह नहीं है कि वह UTF-8 है या UTF-16 या UTF-32 है। दो समस्याएं हैं: एक, UTF-16 और UTF-32 को सही बाइट-ऑर्डर करने की आवश्यकता है। दो, जो भी इसे एक एनएसएसट्रिंग में परिवर्तित करता है * एन्कोडिंग को अवश्य जानता है, और अक्सर यूटीएफ -8 एन्कोडिंग को मान लेगा। आमतौर पर, UTF-8 को सही तरीके से संभालने की सबसे अधिक संभावना है।
gnasher729

1
@bendytree वास्तव में यह नहीं करता है, -dataUsingEncoding: एक गैर-शून्य-टर्मिनेटेड स्ट्रिंग लौटाएगा जो कि stringWithUTF8String है: आवश्यकता है, आप स्मृति को पढ़ने के लिए सीमाएँ चाहते हैं जो आप नहीं चाहते हैं। क्या यह वापस धर्मान्तरित है: -initWithData: एन्कोडिंग:।
साइको

1
@ अल्बर्ट रेनशॉ वर्तमान में (इस तरह से रहने वाली चीजों की कोई गारंटी नहीं) NSStringयूटीएफ -16 का आंतरिक रूप से उपयोग करता है, इसलिए इसमें थोड़ा सा प्रदर्शन हो सकता है क्योंकि इसे यूटीएफ -16 <-> यूटीएफ -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 द्वारा प्रलेखित: अधिकतम गति: एन्कोडिंग: और cStringUsingEncoding ::

    ध्यान दें कि डेटा द्वारा लौटाया गया dataUsingEncoding:allowLossyConversion:एक सख्त सी-स्ट्रिंग नहीं है क्योंकि इसमें NULL टर्मिनेटर नहीं है


14
ये गलत है! कृपया मेरी पोस्ट यहाँ देखें: stackoverflow.com/q/14087094/192819
jsswain

4
हाँ। dataUsingEncoding:अशक्त डेटा वापस नहीं करता है। केवल UTF8Stringऔर अन्य विधियाँ जो C स्ट्रिंग लौटाती हैं, अशक्त-समाप्त स्ट्रिंग लौटाती हैं।
पीटर होसी

@PeterHosey क्या आपके पास इसके लिए कोई स्रोत है? मुझे लगता है कि किसी भी डॉक्स में एक कठिन समय मिल रहा है।
शॉर्टस्टफसुशी

1
धन्यवाद @PeterHosey, डॉक्स आप लिंक किए गए वहाँ है स्पष्ट रूप से शून्य समाप्ति की कमी राज्य - (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)। मुझे यह पहले याद आ गया होगा। मैं भविष्य में कुछ भी लिखना सुनिश्चित करूँगा, हालाँकि।
शॉर्टस्टफशूशी

1
(जो किसी के लिए सोच रहा है: शॉर्टस्टफशूशी बोली के तहत है cStringUsingEncoding:। मैं देख रहा था dataUsingEncoding:।)
पीटर होसी

20

स्विफ्ट डेवलपर के यहाँ आने के मामले में,

NSString / स्ट्रिंग से NSData में परिवर्तित करने के लिए

var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)

18

उद्देश्य सी:

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

संभवतः प्रोसेसर-गहन अन्य तरीकों की तुलना में, लेकिन बहुत उपयोगी है यदि आप दृढ़ता के लिए फ़ाइल सिस्टम तक पहुंच रहे हैं
स्टीफन जे

10

सबसे पहले, आपको dataUsingEncoding:गुजरने के बजाय उपयोग करना चाहिए UTF8String। आप केवल उस एन्कोडिंग में स्ट्रिंग की UTF8Stringआवश्यकता होने पर उपयोग करते हैं C

फिर, UTF-16केवल अपने संदेश के NSUnicodeStringEncodingबजाय पास NSUTF8StringEncodingकरें dataUsingEncoding:


7

स्विफ्ट 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
यह उत्तर गलत है जब strकोड अंक 127 से बड़ा है। यह इसलिए है क्योंकि str.lengthयूनिकोड वर्णों की संख्या देता है, बाइट्स की संख्या नहीं। उदाहरण के लिए, अगर strहै @"にほんご", str.length4 देता है, जबकि str.UTF8Stringवास्तव में 12 बाइट का है। यहां तक ​​कि अगर आप str.lengthद्वारा प्रतिस्थापित करते हैं strlen(str.UTF8String), तब भी यह उस मामले के लिए गलत होगा जहां strNULL वर्ण शामिल है, जैसे @"にほ\0んご"
पैंग

[NSJSONSerialization JSONObjectWithData: डेटा विकल्प: NSJSONReadingMutableLeaves त्रुटि: & त्रुटि] के साथ उपयोग करते समय इस तरह से बनाई गई NSData ऑब्जेक्ट छूट को फेंक देती है;
Adobels

2

उद्देश्य सी:

NSData को NSString:

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

उद्देश्य सी

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.