Подтвердить что ты не робот

Специальные символы в Android смс

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Привет