Да, если строка закодирована с использованием одной из этих кодировок. Заметки о C-строках относятся к C-строкам. NSString не является строкой C, и метод, который вы описываете, не работает со строками C; он работает с произвольными данными, которые могут быть закодированы самыми разными способами.
Как пример:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSData *data = [@"test" dataUsingEncoding:NSUTF16StringEncoding];
NSStringEncoding encoding = [NSString stringEncodingForData:data
encodingOptions:nil
convertedString:nil
usedLossyConversion:nil];
NSLog(@"%ld == %ld", (unsigned long)encoding,
(unsigned long)NSUTF16StringEncoding);
}
return 0;
}
// Output: 10 == 10
В вашем конкретном примере сказано, что если name
действительно то, что говорится, «строка C с нулевым символом в конце», то это никогда не может быть UTF-16, потому что строки C не могут быть закодированы в UTF- 16. Строки C заканчиваются на \ 0, а \ 0 - очень распространенный символ в UTF-16. Однако, не видя больше кода, я бы не рискнул, насколько точен этот комментарий.
Если ваш настоящий вопрос здесь «задан произвольной кодировкой, безопасной для c-строки, возможно ли, что stringEncodingForData:
вернет кодировку, не безопасную для c-строки», тогда ответ «да, возможно, и определенно не обещано, что не будет, даже если не сегодня ». Если вам нужно это предотвратить, я рекомендую использовать NSStringEncodingDetectionSuggestedEncodingsKey
и ...UseOnlySuggestedEncodingsKey
, чтобы сделать его кодировкой, которую вы можете обрабатывать. (Вы также можете использовать ...DisallowedEncodingsKey
для предотвращения определенных многобайтовых кодировок, но это не будет таким надежным.)