2011-08-01 24 views
12

Zauważyłem ten problem od lat, nie wiedząc, skąd pochodzi. Obawiam się, że ten błąd jest wciąż zauważalny w nowych wersjach Androida w 2011 roku i mam nadzieję, że w końcu pomożecie mi go w pełni zrozumieć, jeśli nie rozwiążecie go.Znaki specjalne w Androidzie sms

Rozważmy podaną (rzeczywistą) sytuację. Mister "A" używa niestandardowej aplikacji SMS/MMS od Sony na swoim Xperia Arc (oficjalny 2.3.3). Pan B używa aplikacji na stosy SMS/MMS na Androida w swoim Milestone (Cyanogen 6.12, nieoficjalny 2.2). Obaj używają Androida w języku francuskim (jeśli to ma znaczenie).

Kiedy A wysyła sms do B zawierającego specjalne znaki, takie jak "ç", "ê", B otrzymuje wiadomość z tymi znakami zastąpionymi przez spację. Znaki takie jak "é" działają jednak dobrze. Gdy B wysyła sms do A, wszystko działa poprawnie. Kiedy A wysyła ten SMS do siebie, wszystko działa poprawnie.

Wniosek: nie jest to wina operatora telefonii komórkowej, ponieważ działa ona w jeden sposób, a nie w drugą.

Tak, domyślam się, że coś było nie tak z niestandardową aplikacją A. Zastąpiono go apkiem z telefonu B. Wszystko pozostało takie samo. Odkompilowałem aplikację i nie znalazłem miejsca, w którym zostało wykonane kodowanie ciągu sms. Doszedłem do wniosku, że błąd nie pochodzi z aplikacji, ale ze sposobu, w jaki Android koduje ciągi ...

Przeprowadziłem kolejny test: Napisałem sms z tylko standardowymi znakami, coś jak 250 znaków w 1,5 sms. Następnie dodaję "ç" do sms. Na telefonie A: licznik mówi, że zużył 10 znaków. Na telefonie B: licznik mówi, że sms ma teraz 3 sms: rozmiar sznurka podwojony!

Wniosek: W telefonie A zestaw domyślny zawiera "ç". Na telefonie B, gdy pojawi się "ç", zestaw znaków zmienia się, a każdy znak potrzebuje dwa razy więcej miejsca niż oryginał. (Czy coś mi brakuje?)

Pytania: Dlaczego inna wersja Androida nie korzysta z tego samego domyślnego zestawu znaków? Na Androidzie, czy są to domyślne zestawy znaków, w zależności od typu rom? Czy możemy skonfigurować/zmienić te zestawy znaków gdzieś (w menu lub bezpośrednio na telefonie zrootowanym)? Czy istnieje inny prosty sposób na rozwiązanie tego problemu?

Każda pomoc, wyjaśnienie lub doświadczenie jest mile widziany :)

Odpowiedz

3

cierpi na problemy z kodowaniem znaków. Z opisu wynika, że ​​"A" wysyła dane w jednym zestawie znaków i nie zawiera informacji o tym, jaki zestaw znaków jest. Główną przyczyną jest przekazywanie rozszerzonych (nie ASCII) znaków między dwoma systemami, które muszą uzgodnić kodowanie do użycia. Jeśli ograniczasz się do wartości 8-bitowych, systemy zgadzają się korzystać z tych samych stron kodowych. W SMS znajduje się specjalna strona kodowa GSM dla 7 lub 8 bitowych kodowań lub UTF-16 może być użyty, który używa 2 bajtów do reprezentowania każdego znaku. To, co widzisz po wprowadzeniu 250 znaków, a następnie pojedynczej rozszerzonej postaci pokazuje, co dzieje się w aplikacji. Wiadomość SMS jest ograniczona do 140 oktetów. Kiedy używasz 8-bitowego kodowania, twoje 250 znaków pasuje do 2 wiadomości (250 < 280), jednak po dodaniu "ç" aplikacja zmieniła się na kodowanie UTF-16, więc nagle wszystkie twoje postaci biorą 2 oktety i możesz tylko zmieścić 70 znaków w wiadomości. Teraz przesłanie całej wiadomości zajmuje 3,5 wiadomości SMS.

W systemie Android dekodowanie wiadomości SMS jest częścią kodu telefonii szkieletowej w SmsCbMessage.java. Wypracowuje kod języka i kodowanie treści wiadomości.Jeśli jest to niepoprawne (wiadomość została zakodowana za pomocą angielskiej strony kodowej, ale używa rozszerzonych znaków), możesz wyświetlić dziwne znaki.

Masz rację, że nie jest to wina sieci mobilnej. Podejrzewam, że jest to aplikacja komunikatora telefonu A, chociaż możliwe jest, że Android nie potrafi prawidłowo zidentyfikować kodowania ważnego SMS-a. Zastanawiam się, jak to działa między A i iPhonem lub innym urządzeniem producenta.

+0

Dziękuję za odpowiedź. Przeprowadziliśmy test z innymi telefonami, taki sam wynik, gdy A wysyła wiadomość ze znakami specjalnymi. Sądzę więc, że jest problem, gdy A koduje sms. Czy na pewno robisz to w aplikacji SMS/MMS, a nie wewnętrznie w środowisku Android? Jak więc możemy wyjaśnić fakt, że zmiana aplikacji na telefonie A dla aplikacji pochodzącej z telefonu B nie rozwiązała problemu? – Romain360

+0

Ponieważ są to oba urządzenia z Androidem, możesz sprawdzić wiadomość SMS, gdy przechodzi przez warstwę radiową, która jest po jej zakodowaniu. Jeśli używasz "adb logcat -b radio | tee radio.log ", a następnie wyślij wiadomość testową, powinieneś zobaczyć coś takiego: – patthoyts

+0

E/RIL (133): smsc: E/RIL (133): strlen (pdu) = 114 (0x39), pdu: 01000c91449732832356000b2c005400650073007400 200065006e0063006f00640069006e0067002000e700200061006e006400200069002e To jest zakodowana w utf-16 wersja "Kodowanie testu ç i é". z niektórymi bajtami nagłówkowymi z przodu. Możemy to sprawdzić za pomocą pythona >>> x [26:] .decode ('hex') .dodode ('utf-16be') kodowanie 't' \ xe7 i \ xe9. ' Dzięki temu możesz sprawdzić wyjście do warstwy radiowej, które powinno pokazać, że zostało błędnie zakodowane przed odejściem od telefonu. – patthoyts

0

Napotkano ten sam problem, gdy musiałem pokazać kilka znaków specjalnych w aplikacji unisode sms. Metodą, której użyłem, był ciąg znaków, który muszę wysłać jako SMS, uruchomić go w pętli for, aby pobrać każdy znak, znaleźć jego kod ascii, użyć tej wartości całkowitej do zakodowania tego ciągu przy użyciu ogranicznika. Ten ciąg może zostać wysłany jako sms, który musi zostać zdekodowany przy użyciu tego samego ogranicznika, który jest używany do wysyłania, a następnie przekształcić każdy znak ASCII w nim na znaki (specyficzne dla języka), utworzyć ciąg przez dodanie skonwertowanych znaków. Ten tekst będzie taki sam jak ten, który został wysłany jako SMS.

Pozdrawiam