В общем, вы не можете. Однако вы можете достаточно надежно идентифицировать файлы UTF-8 - если файл является допустимым UTF-8, маловероятно, что это будет какая-либо другая кодировка (кроме случаев, когда все байты находятся в диапазоне ASCII, в этом случае любой « расширенное кодирование ASCII », включая UTF-8, даст тот же результат). Все кодировки Unicode также имеют опциональную BOM , которая их идентифицирует. Таким образом, разумный подход будет:
- Ищите действительную спецификацию. Если есть, используйте соответствующую кодировку.
- В противном случае попробуйте интерпретировать его как UTF-8. Вы можете сделать это, позвонив по номеру
initWithData:data encoding:NSUTF8StringEncoding
и проверив, если результат не ноль.
- Если это не помогло, используйте 8-битную кодировку по умолчанию, например
-[NSString defaultCStringEncoding]
(которая обеспечивает предположение, соответствующее локали).
В можно попытаться улучшить предположение на последнем шаге, попробовав различные кодировки и выбрав ту, которая имеет наименьшее количество последовательностей букв с мусором в середине, где «мусор» - любой символ это не буква, пробел или знак препинания. Это значительно увеличит сложность, хотя на самом деле не будет надежным.
Короче говоря, чтобы иметь возможность обрабатывать все доступные кодировки, вам нужно сделать то, что делает TextEdit: передать решение пользователю.
О, еще одна вещь: с 10.5 кодировка часто сохраняется с файлом в недокументированном расширенном атрибуте com.apple.TextEncoding. Если вы откроете файл с +[NSString stringWithContentsOfFile:]
или подобным, он будет автоматически использован, если присутствует.