NSString අගය NSData බවට පරිවර්තනය කරන්නේ කෙසේද?


Answers:


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

UTF-16 හෝ UTF-32 වැනි ඉහළ දෙයකට වඩා UTF-8 භාවිතා කිරීමේ වාසි සහ අවාසි මොනවාද?
ඇල්බට් රෙන්ෂෝ

4
එන්එස්ඩේටා එය යූටීඑෆ් -8 හෝ යූටීඑෆ් -16 හෝ යූටීඑෆ් -32 ද යන්න ගැන එතරම් තැකීමක් නොකරයි. ගැටළු දෙකක් තිබේ: එකක්, යූටීඑෆ් -16 සහ යූටීඑෆ් -32 නිවැරදි බයිට් ඇණවුම් කිරීම අවශ්‍ය වේ. දෙක, කවුරුන් හෝ එය නැවත NSString * බවට පරිවර්තනය කරන්නේ නම්, කේතන ක්‍රමය දැන සිටිය යුතු අතර බොහෝ විට UTF-8 කේතීකරණය උපකල්පනය කරනු ඇත. සාමාන්යයෙන්, UTF-8 බොහෝ විට නිවැරදිව හැසිරවීමට ඉඩ ඇත.
gnasher729

1
endbendytree ඇත්ත වශයෙන්ම එසේ නොවේ, -dataUsingEncoding: ශුන්‍ය නොවන අවසන් කරන ලද නූලක් නැවත ලබා දෙනු ඇත. එය නැවත පරිවර්තනය කරන්නේ: -initWithData: කේතීකරණය :.
මනෝ

1
L ඇල්බර්ට් රෙන්ෂෝ දැනට යූටීඑෆ් NSString-16 අභ්‍යන්තරව භාවිතා කරයි, එබැවින් යූටීඑෆ් -16 <-> යූටීඑෆ් -8 පරිවර්තනයක් කිරීමට අවශ්‍ය නොවන නිසා සුළු කාර්ය සාධනයක් ලබා ගත හැකිය. පුද්ගලිකව, අපි කැමතියි (@ gnasher729 යෝජනා කරන පරිදි) කාර්ය සාධනයට වඩා ශක්තිමත් බව සහ සෑම තැනකම UTF-8 භාවිතා කරන්න.
සමහර සංවර්ධකයින්


32

කරන්න:

NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];

ඉදිරියට යාමට නිදහස් වන්න NSJSONSerialization:JSONObjectWithData.


NULL ටර්මිනේටරය පිළිබඳ පිළිතුර නිවැරදි කිරීම

අදහස්, නිල ලියකියවිලි සහ සත්‍යාපන වලින් පසුව , NULL ටර්මිනේටරයක් ​​ඉවත් කිරීම සම්බන්ධයෙන් මෙම පිළිතුර යාවත්කාලීන කරන ලදි:

  1. DataUsingEncoding විසින් ලේඛනගත කර ඇති පරිදි :

    ප්‍රතිලාභ අගය

    dataUsingEncoding:allowLossyConversion:දෙවන තර්කය ලෙස NO සමඟ ආයාචනා කිරීමේ ප්‍රති result ලය

  2. GetCString: maxLength: encoding: සහ cStringUsingEncoding විසින් ලේඛනගත කර ඇති පරිදි :

    NULL ටර්මිනේටරයක් ​​නොමැතිdataUsingEncoding:allowLossyConversion: බැවින් ආපසු ලබා දෙන දත්ත දැඩි සී-ස්ට්‍රිං එකක් නොවන බව සලකන්න


14
මේක වැරදියි! කරුණාකර මගේ සටහන මෙතැනින් බලන්න: stackoverflow.com/q/14087094/192819
jpswain

4
ඔව්. dataUsingEncoding:අවලංගු කරන ලද දත්ත ආපසු ලබා නොදේ. UTF8Stringසී නූලක් ආපසු ලබා දෙන වෙනත් ක්‍රම පමණක් ශුන්‍ය-අවසන් කළ නූලක් ලබා දෙයි.
පීටර් හෝසි

EtPeterHosey ඔබට ඒ සඳහා කිසියම් ප්‍රභවයක් තිබේද? ඕනෑම ලේඛනයක එය සොයා ගැනීමට මට අපහසුය.
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

පරමාර්ථය-සී:

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සම්මත කරන්න .NSUnicodeStringEncodingNSUTF8StringEncodingdataUsingEncoding:


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
str127 ට වඩා විශාල කේත ලකුණු අඩංගු වන විට මෙම පිළිතුර වැරදිය . මෙයට හේතුව str.lengthයුනිකෝඩ් අක්ෂර ගණන මිස බයිට් ගණන නොවේ. උදාහරණයක් ලෙස, එසේ strනම් @"にほんご", str.length4 ක් ලබා දෙන අතර str.UTF8Stringඇත්ත වශයෙන්ම බයිට් 12 ක් අඩංගු වේ. ඔබ වෙනුවට පවා නම් str.lengthවිසින් strlen(str.UTF8String), එය තවමත් කොහේ නඩුව සඳහා වැරදි වනු ඇත strඑවැනි ලෙස NULL චරිතය, අඩංගු වේ @"にほ\0んご".
පැන්ග්

[NSJSONSerialization JSONObjectWithData: දත්ත විකල්ප: NSJSONReadingMutableLeaves error: & error];
ඇඩොබෙල්ස්

2

පරමාර්ථය-සී:

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

පරමාර්ථය-සී

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.