Ogólnie rzecz biorąc, nie można. Można jednak dość wiarygodnie zidentyfikować pliki UTF-8 - jeśli plik jest poprawny UTF-8, nie jest bardzo prawdopodobne, że ma to być jakiekolwiek inne kodowanie (z wyjątkiem sytuacji, gdy wszystkie bajty znajdują się w zakresie ASCII, w takim przypadku dowolne ". rozszerzone kodowanie ASCII, w tym UTF-8, da taki sam wynik). Wszystkie kodowania Unicode mają również opcjonalny BOM, który je identyfikuje. Tak więc rozsądne podejście byłoby następujące:
- Poszukaj prawidłowego BOM. Jeśli takowy istnieje, użyj odpowiedniego kodowania.
- W przeciwnym razie spróbuj interpretować je jako UTF-8. Możesz to zrobić, dzwoniąc pod numer
initWithData:data encoding:NSUTF8StringEncoding
i sprawdzając, czy wynik nie jest zerowy.
- Jeśli to się nie powiedzie, użyj domyślnego 8-bitowego kodowania, takiego jak
-[NSString defaultCStringEncoding]
(która zapewnia trafne domysły).
To jest można spróbować poprawić przypuszczenie W ostatnim kroku, próbując różnymi kodowanie i wybiera ten, który ma najmniejszą liczbę sekwencji liter ze śmieciami w środku, gdzie „śmieci” oznacza dowolny znak, że to nie jest to litera, spacja ani wspólny znak interpunkcyjny. Zwiększyłoby to znacznie złożoność, a jednocześnie nie byłoby niezawodne.
Krótko mówiąc, aby móc obsłużyć wszystkie dostępne kodowania, musisz wykonać polecenie TextEdit: zablokować decyzję użytkownikowi.
Aha, jeszcze jedno: od 10.5 kodowanie jest często przechowywane z plikiem w nieudokumentowanym rozszerzonym atrybucie com.apple.TextEncoding. Jeśli otworzysz plik o numerze +[NSString stringWithContentsOfFile:]
lub podobnym, zostanie on automatycznie użyty, jeśli jest obecny.
Wydaje się, że jest powód, dlaczego jest jeszcze nie oficjalne. Uruchomiłem go za pomocą pliku NSData PDF, który powraca - 2147482362. – FireDragonMule
Nie jestem do końca pewien, czy tak ma działać. Plik pdf nie jest ciągiem znaków i ta metoda wykrywa kodowanie ciągów z 'NSData'. Jaki jest twój zamiar? – HAS
Pobieram plik pdf przez SDK jako NSData. Mam tylko problemy z wyświetlaniem go w widoku strony teraz, ponieważ nie wiem, co to jest kodowanie lub czy istnieje kodowanie. – FireDragonMule