2012-01-18 5 views
1

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

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

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

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

  • в тех случаях, когда кодирование объекта NSString известно/ожидается уже быть определенного типа и не преобразования требуется, то это безопасно (возможно, внутренне быстрее) использовать d efaultCStringEncoding (от того, что я прочитал Objective-C использует UTF-16 внутри, не уверен, если LE или BE, но я бы предположить, LE, потому что платформа LE)

ТИА

ответ

3

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

Смежные вопросы