Кодировка должна быть указана для преобразования NSString в NSData по той же причине, по которой ее необходимо указывать при переходе от NSData к NSString.
Объект NSData является оболочкой для строки абсолютно необработанных байтов.Если строка NSString не указывает какую-либо кодировку, она не знает, что писать, потому что на уровне единиц и нулей кодировка UTF-16 выглядит иначе, чем кодировка UTF-8 той же буквы, и, конечно,если вы напишите UTF-16 как big-endian и прочитаете его как little-endian, вы получите бред.
Другими словами, не думайте, что это преобразование или экранирование строки;он генерирует байтовый буфер, и кодировка сообщает ему, какие из них и нули записать, когда следующий символ "a", а какие записать, когда он означает "妈".
Какна ваш вопрос ... вот мои два цента.
1) Если вы конвертируете строку NSString в NSData, чтобы ваша же программа могла преобразовать ее позже, и никакому другому программному обеспечению не потребуется иметь дело с этим NSDataпока вы не прочитаете его обратно в строку NSString, ничего из этого не имеет значения.Все, что имеет значение, это то, что ваша кодировка строки в данные и ваша кодировка данных в строку совпадают.
2) Если вы имеете дело только с символами ASCII, вы, вероятно, можете избежать неприятностей, просто потому, чтомногие виды кодирования используют одно и то же представление для символов младше 128. Но это легко ломается, даже с такими мелочами, как умные кавычки.
3) Несмотря на название, defaultCStringEncoding не следует использовать по умолчанию.Он разработан для особых случаев, когда вам нужно иметь дело с системными строками и иначе не знать, как система работает со своими внутренними строками.Это относится к тому, как строки обрабатываются в реализации C по умолчанию, а НЕ во внутренних структурах NSString, поэтому не обязательно выигрыш в производительности.
4) Если вы пишете строку с неизвестной кодировкой строки, и вы пытаетесьчтобы прочитать его с другой строковой кодировкой, ваш код потерпит неудачу;во многих случаях вы просто получите пустую строку.
Итог: кто будет пытаться интерпретировать ваши объекты NSData?Если это ваше собственное приложение, выберите подходящую для вас кодировку (я использую UTF8 для всего) и используйте ее для обоих преобразований.В противном случае выясните, что вашей экосистеме нужно для чтения или записи, и сделайте это своим стандартом.