Специальные символы в смс Android - PullRequest
13 голосов
/ 02 августа 2011

Я наблюдал эту проблему уже много лет, не зная, откуда она взялась.Я обеспокоен тем, что эта ошибка все еще наблюдается в новых версиях Android в 2011 году, и я надеюсь, что вы, наконец, сможете помочь мне полностью понять ее, если не решите ее.

Давайте рассмотрим данное (реальное)ситуация.Мистер "А" использует собственное приложение SMS / MMS от Sony на своей Xperia Arc (официальная версия 2.3.3).Мистер Б использует приложение стека SMS / MMS для Android на своем Milestone (Cyanogen 6.12, неофициальный 2.2).Оба они используют Android по-французски (если это имеет значение).

Когда A отправляет SMS-сообщение на B, содержащее специальные символы, такие как «ç», «ê», B получает сообщение, в котором эти символы заменяются пробелом.Символы вроде "é" работают нормально, хотя.Когда B отправляет смс A, все работает нормально.Когда А отправляет это смс самому себе, все работает нормально.

Вывод: это не ошибка мобильного провайдера, так как он работает одним и другим способом.

Итак, сначала я догадался, что с пользовательским приложением A что-то не так.Заменил на него апк с телефона Б.Все осталось прежним.Я декомпилировал приложение и не нашел, где было выполнено кодирование строки sms.Я пришел к выводу, что ошибка связана не с приложением, а с тем, как Android кодирует строки ...

Я провел еще один тест: я написал смс только со стандартными символами, что-то вроде 250 символов за 1,5 смс.Затем я добавляю "ç" к смс.На телефоне А: счетчик говорит, что он потребляет 10 символов.На телефоне B: счетчик говорит, что смс теперь принимает 3 смс: размер строки удвоился!

Вывод: На телефоне А кодировка по умолчанию содержит «ç».На телефоне B, когда появляется «ç», кодировка меняется, и каждому символу требуется вдвое больше места.(Или я что-то упустил?)

Вопросы: Почему разные версии Android не используют одну и ту же кодировку по умолчанию?На Android эти кодировки по умолчанию зависят, например, от rom?Можем ли мы настроить / изменить эти кодировки где-нибудь (в меню или непосредственно на рутированном телефоне)?Есть ли другой простой способ исправить это?

Любая помощь, объяснение или опыт приветствуются:)

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Вы страдаете от проблем с кодированием.Из описания видно, что «А» отправляет данные в одной кодировке и не включает информацию о том, что это за кодировка.Основная причина заключается в том, что для передачи расширенных (не ascii) символов между двумя системами они должны согласовать используемую кодировку.Если вы ограничены 8-битными значениями, то системы соглашаются использовать одни и те же кодовые страницы.В SMS есть специальная кодовая страница GSM для 7- или 8-битного кодирования или может использоваться UTF-16, который использует 2 байта для представления каждого символа.То, что вы видите, когда вводите 250 символов, за которыми следует один расширенный символ, показывает, что происходит в приложении.SMS-сообщение ограничено до 140 октетов.Когда вы используете 8-битную кодировку, ваши 250 символов помещаются в 2 сообщения (250 <280), однако, как только вы добавили «ç», приложение перешло на использование кодировки UTF-16, так что внезапно все ваши персонажи берут 2 октета, и вы можете толькопоместите 70 символов в сообщение.Теперь для передачи всего сообщения требуется 3,5 SMS-сообщения. </p>

В Android декодирование SMS-сообщения является частью телефонного кода платформы в SmsCbMessage.java.Разрабатывает код языка и кодировку тела сообщения.Если это неверно (сообщение было закодировано с английской кодовой страницей, но использует расширенные французские символы), то могут появиться странные символы.

Вы правы, что это не мобильная сеть по вине.Я подозреваю, что это приложение для обмена сообщениями телефона А, хотя возможно, что Android не может правильно определить кодировку действующего SMS.Интересно, как это работает между А и iPhone или устройством других производителей.

0 голосов
/ 28 декабря 2011

Я столкнулся с той же проблемой, когда мне пришлось показывать несколько специальных символов в приложении смс-юникод.Метод, который я использовал - взять строку, которую мне нужно отправить как смс, запустить ее в цикле for, чтобы взять каждый символ, найти его код ascii, использовать это целочисленное значение для кодирования этой строки с помощью разделителя.Эта строка может быть отправлена ​​как смс, которая должна быть декодирована с использованием того же разделителя, который используется для отправки, а затем преобразовать каждый символ кода ascii в нем в символы (для конкретного языка), сформировать строку, добавив преобразованные символы.Этот текст будет таким же, как тот, который был отправлен как смс.

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...