NSString к соображениям кодирования NSData - PullRequest
1 голос
/ 19 января 2012

Я понимаю, почему при переходе от NSData к NSString вам нужно указать кодировку.Однако я нахожу разочаровывающим, как обратное (NSString to NSData) требует для указания кодировки.

В этом связанном вопросе ответы, предложенные с использованием NSUTF8StringEncoding или defaultCStringEncoding , причем последнее не объяснено полностью.

Поэтому я просто хотел спросить, верно ли следующее при преобразовании NSString в NSData:

  • Если вы хотите быть на 100% уверены, что двоичное представление объекта NSString - UTF8, тогда используйте NSUTF8StringEncoding (или любое другое кодирование)

  • В тех случаях, когда известно / ожидается, что кодировка объекта NSString уже имеет определенный тип и преобразование не требуется, тогда безопасно (возможно, внутренне быстрее) использовать defaultCStringEncoding (из того, что яЯ прочитал, что цель-c использует UTF-16 для внутреннего использования, не уверен, что LE или BE, но я бы предположил, что LE, потому что платформа - LE)

ТИА

1 Ответ

3 голосов
/ 18 октября 2012

Кодировка должна быть указана для преобразования 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 для всего) и используйте ее для обоих преобразований.В противном случае выясните, что вашей экосистеме нужно для чтения или записи, и сделайте это своим стандартом.

...