«ASCII to NSData» не имеет смысла, потому что ASCII - это кодировка;если у вас есть закодированные символы, то у вас есть данные.
Кодировка - это преобразование идеальных символов Unicode (кодовые точки) в одно-или более-байтовые единицы (кодовые единицы), возможно, в последовательности, такие как UTFСуррогатные пары -16.
NSString - более или менее идеальный объект Unicode.Он содержит символов строки в Unicode, независимо от кодировки *.
ASCII - кодировка.UTF-8 также является кодировкой.Когда вы запрашиваете строку для ее UTF8String
, вы просите ее закодировать ее символы как UTF-8.
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
В результате получается
######### source ©
[data description] = "<"c2>
Это потому, что вы прошли неправильную длину.Длина строки (в символах) не совпадает с количеством единиц кода (в данном случае байтов) в некоторой кодировке.
Правильная длина strlen([source UTF8String])
, но она проще для вас и быстрее ввремя выполнения, чтобы использовать dataUsingEncoding:
, чтобы запросить строку для создания объекта NSData.
Когда я изменяю кодировку на
NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
Вы не сделалиизменить кодировкуВы все еще кодируете его как UTF-8.
Используйте dataUsingEncoding:
.
Вопрос в том, каков наилучший способ получить тот же байт в objC, как и вJava?
Использовать ту же кодировку.
Не существует такого понятия, как «расширенный ASCII».Существует несколько различных кодировок, которые основаны (или, по крайней мере, совместимы с) ASCII, включая ISO 8859-1, ISO 8859-9, MacRoman, кодовую страницу Windows 1252 и UTF-8.Вам нужно решить, какой из них вы имеете в виду, и указать строке для кодирования символов с этим.
Еще лучше, продолжайте использовать UTF-8 - это почти всегда правильный выбор для текста в основном ASCII - и измените свойВместо этого Java-код.
NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
Результат:
[data description] = (null)
Истинный ASCII может кодировать только 128 возможных символов.Юникод включает в себя все ASCII без изменений, поэтому первые 128 кодовых точек в Юникоде - это то, что может кодировать ASCII.Что-нибудь еще, ASCII не может кодировать.
Я видел NSASCIIStringEncoding
, ведущий себя как эквивалент NSISOLatin1StringEncoding
раньше;Похоже, они могли изменить его на чистую кодировку ASCII, и если это так, то это хорошо.В ASCII нет символа авторского права.То, что вы видите здесь, является правильным результатом.
* Это не совсем так;символы обозначаются как UTF-16, поэтому любые символы вне базовой многоязычной плоскости представляются в виде суррогатных пар, а не целых символов, как это было бы в действительно идеальном строковом объекте.Это компромисс.В Swift встроенный тип String является идеальным идеальным объектом Unicode;символы являются символами, никогда не разделяются, пока не закодированы.Но, работая с NSString (будь то в Swift или в Objective-C), вы должны рассматривать его как идеальную строку.