Znowu kodowanie znaków :(

0

Główni bohaterowie: Android Studio i kłopot w roli głównej.
A teraz po kolei...
Najpierw bawiłem się w App Inventorze. W bazie MySQL teksty mam zapisane w iso-8859-2. Wykorzystując iconv w pliku php zmieniałem sobie kodowanie do utf-8 i wszystko pięknie widziałem w aplikacji na telefonie.

Po instalacji Android Studio pobieram ten sam plik php, po czym oczom mym w TextView ukazują się krzaczki. Zaczynam się denerwować. W cPanelu tworzę sobie nowy testowy plik php (w kodowaniu utf-8):

<?php 
echo "ąśżźćół";
?>

, pobieram go w aplikacji androida, wyświetlam kolejny raz w TextView i widzę krzaczki. Denerwuję się coraz poważniej.
Wynalazłem na tym forum, że "wewnętrznie" android korzysta z utf-16le. Próbuję, tak na wszelki wypadek, w php iconv utf-8 do utf-16le i nadal widzę krzaczki.
Oczywiście krzaczki w każdym wypadku są inne, ale jakoś mnie to nie podbudowuje.
Czy jest jakiś sposób, aby okiełznać ten temat, czy nie? Ja wiem, że "polska język, trudna język", ale może da się jakoś z tym problemem poradzić?
Będę wdzięczny za każdą pomoc :)

0

Dziękuję za zainteresowanie.

a) convert file encoding to UTF-8 or

  • chyba nie o to Ci chodziło. Mogę sobie konwertować plik w Android Studio, ale przecież dopiero to, co przychodzi z serwera, nie pasuje mojemu telefonowi.

b) set the right file encoding in your build.gradle script:

  • wydaje mi się, że problem nie leży w kodowaniu plików aplikacji, którą tworzę, ale w interpretacji tego, co przychodzi z serwera.

Poczyniłem, zresztą, kolejne odkrycie. Pod adresem http://konfiguracja.c0.pl/plitery.html znalazłem fajną tablicę. Zapisałem na serwerze znaki ąśżźć w iso-8859-2, po czym uzyskałem w TextView ±¶¿¼æ, co mówi mi jasno, że aplikacja uznaje odebrane znaki jako iso-8859-1. Trafiłem na wątek http://stackoverflow.com/questions/17024268/how-to-encode-russian-text-in-post-request-using-apache-httpclient, gdzie znalazłem nast. tekst:

The request or response body can be any encoding, but by default is ISO-8859-1

Po prostu wszystko, co przychodzi do aplikacji, jest traktowane jako iso-8859-1 (w którym chyba w ogóle nie ma polskich znaków).
Jak mam "poinformować" aplikację, że kodowanie jest inne, ew. co innego zrobić? Przecież Wy także piszecie aplikacje wykonujące w pewnym momencie zadanie, jakie próbuję wcisnąć w mój programik. Jak sobie z tym radzicie?

Odpowiedź serwera pobieram przez sekwencję:

private final HttpClient Client = new DefaultHttpClient();
HttpGet httpget = new HttpGet(urls[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
Content = Client.execute(httpget, responseHandler);
0

To, że w pliku php masz ustawione dane kodowanie nie znaczy, że druga strona je tak odbierze. Wstaw to u siebie w php przed wszystkim innym:

header('Content-Type: text/html; charset=utf-8');
0

Dziękuję za podpowiedź (też o czymś takim myślałem, ale nie wiedziałem, jak to wpisać :)), jednak po wstawieniu podanej linii otrzymuję wynik w postaci:

header('Content-Type: text/html; charset=utf-8');
"krzaczki"

Przy czym krzaczki są dokładnie takie same, jak bez nagłówka. Rozumiem, że przesyłany jest cały plik, a nie jest w ogóle interpretowane polecenie header. Zapewne dlatego, że plik jest pobierany jako czysty tekst.
Przecież na pewno jest sposób, aby to działało prawidłowo, bo właśnie App Inventor obsługuje takie kodowanie bez kłopotu.

0

StackOverflow jest wielki! ;) Po trzech dniach szukania udało się wreszcie.

Wątek http://stackoverflow.com/questions/4770388/android-displaying-utf-8-russian-on-device dał mi odpowiedź i tu wstawiam ją dla potomnych.
Kłopotem moim był BasicResponseHandler, który **zawsze **obsługuje znaki jako ISO-8859-1 i zmienić tego nie można. W związku z tym należy napisać własny ResponseHandler obsługujący np. UTF-8, który właśnie można znaleźć w wymienionym wątku.

Jeszcze raz dziękuję za zainteresowanie problemem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1