2010-04-29 14 views
9

Nie mogę czytać i pisać znaków rozszerzonych (np. Francuskich znaków akcentowanych) do pliku tekstowego przy użyciu standardowych metod InputStreamReader pokazanych w przykładach interfejsu API systemu Android. Po odczytaniu pliku za pomocą:Jak odczytać i zapisać UTF-8 na dysku na Androidzie?

InputStreamReader tmp = new InputStreamReader(in); 
BufferedReader reader = new BufferedReader(tmp); 
String str; 
while ((str = reader.readLine()) != null) { 
... 

odczytywanie ciągu znaków jest obcinane przy rozszerzonych znakach zamiast na końcu wiersza. Druga połowa napisu pojawia się w następnej linii. Zakładam, że muszę utrzymywać moje dane jako UTF-8, ale nie mogę znaleźć żadnych przykładów tego, i jestem nowy w Javie.

Czy ktoś może podać mi przykład lub link do odpowiedniej dokumentacji?

+0

To jest właściwie ogólne pytanie w języku Java. – itsadok

+0

Czy to ogólna Java? Jeśli używasz openFileOutput do zapisu w prywatnym obszarze danych w systemie Android, nie ma konstruktora z opcją zestawu znaków: http://developer.android.com/reference/android/content/Context.html#openFileOutput%28java.lang.String % 20int% 29 –

Odpowiedz

26

Bardzo prosta i prosta. :)

String filePath = "/sdcard/utf8_file.txt"; 
String UTF8 = "utf8"; 
int BUFFER_SIZE = 8192; 

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), UTF8),BUFFER_SIZE); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), UTF8),BUFFER_SIZE); 
+0

Dzięki. Czy to działa również przy zapisywaniu w obszarze prywatnych danych? –

+0

Pewnie. Nic specyficznego dla Androida tutaj powyżej 'openFileOutput (..)'. – yanchenko

+0

Mam na myśli użycie openFileOutput? –

9

Gdy tworzysz instancję InputStreamReader, użyj konstruktora, który pobiera zestaw znaków.

InputStreamReader tmp = new InputStreamReader(in, "UTF-8"); 

I zrobić coś podobnego z OutputStreamWriter

Lubię mieć

public static final Charset UTF8 = Charset.forName("UTF-8"); 

w jakiejś klasie użytkowej w moim kodu, tak, że mogę zadzwonić (patrz więcej w Doc)

InputStreamReader tmp = new InputStreamReader(in, MyUtils.UTF8); 

i nie musi obsługiwać UnsupportedEncodingException jeden raz.

1

ten powinien po prostu pracować na Androidzie, nawet bez wyraźnego określenia UTF-8, ponieważ domyślny charset jest UTF-8. czy można odtworzyć ten problem, należy podnieść błąd z powtarzalny przypadku testowego tutaj:

http://code.google.com/p/android/issues/entry

+0

Zdecydowanie musiałem zmienić na UTF-8, aby naprawić błąd. Miałem pozytywny wynik z moimi użytkownikami, którzy wcześniej stwierdzili, że "rozszerzone znaki", takie jak francuski "Osefleks", spowodowały, że plik nie został poprawnie odczytany. Poprosiłem użytkownika o przesłanie mi jego pliku i kiedy przeczytałem go z powrotem w debugerze, zobaczyłem, że rozszerzone postacie były traktowane jako zakończenie linii. Nadal mam oryginalne pliki.Kiedy wrócę do domu, uruchomię projekt testowy, wykorzystując je do zademonstrowania. Zobacz moje pierwsze pytanie do kodu: http://stackoverflow.com/questions/2700983/problem-saving-file-on-motorola-droid-android-2-1 –

0

jeśli obliczu każdy taki rodzaj problemu próbować tego robić. Musisz Encode i Decode swoje dane do Base64. To działało dla mnie. Mogę udostępnić kod, jeśli go potrzebujesz.

0

Sprawdź kodowanie pliku, klikając prawym przyciskiem myszy w eksploratorze projektów i wybierając właściwości. Jeśli nie jest to właściwe kodowanie, musisz wprowadzić znaki specjalne po zmianie, lub przynajmniej to było moje doświadczenie.

Powiązane problemy