Специальные символы в 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?
Можем ли мы настроить/изменить эту кодировку где-нибудь (в меню или непосредственно на корневом телефоне)?
Есть ли еще один простой способ исправить это?
Любая помощь, объяснение или опыт приветствуются:)
Ответы
Ответ 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 в него в символы (зависит от языка), формирует строку, добавляя преобразованные символы. Этот текст будет таким же, как тот, который был отправлен как смс.
Привет