2011-08-01 5 views
12

나는이 문제가 몇 년 전부터 어디서 왔는지 알지 못했다. 2011 년에이 새로운 버그가 Android의 새로운 버전에서 계속 볼 수 있다는 것에 우려합니다. 해결하지 못하면 완전히 이해할 수 있기를 바랍니다.안드로이드 문자의 특수 문자

주어진 (실제) 상황을 생각해 봅시다. 미스터 "A"는 Sony의 Xperia Arc (공식 2.3.3)에서 맞춤 SMS/MMS 앱을 사용하고 있습니다. Mister B는 Milestone (Cyanogen 6.12, 비공식 2.2)에서 Android SMS/MMS 스택 앱을 사용하고 있습니다. 둘 다 프랑스에서 Android를 사용합니다 (문제가있는 경우).

A가 "ç", "ê"와 같은 특수 문자가 포함 된 B로 SMS를 보내면 B는 이러한 문자를 공백으로 대체 한 메시지를 수신합니다. "é"와 같은 문자는 잘 작동합니다. B가 A에게 SMS를 보내면 모든 것이 잘됩니다. A가이 SMS를 자신에게 보냈을 때 모든 것이 잘 작동합니다.

결론 : 모바일 서비스 제공 업체의 잘못은 아니며 다른 방식으로는 작동하지 않기 때문입니다.

그래서 처음에는 A의 맞춤 앱에 문제가 있다는 것을 알았습니다. 그것을 B 전화의 APK로 바꿨습니다. 모든 것이 그대로였습니다. 나는 앱을 디 컴파일했고, SMS 문자열의 인코딩이 어디에서 이루어 졌는지 찾지 못했다. 나는 그 앱에서 버그가 오지 않는다고 결론을 내렸지 만, 안드로이드가 문자열을 인코딩하는 방식에서 ...

나는 다른 테스트를 실행했다 : 나는 1.5 문자의 250 문자와 같은 표준 문자 만 가진 SMS를 작성했다. 그런 다음 SMS에 "ç"을 추가합니다. A의 전화에서 : 카운터는 10자를 소비했다고 말합니다. B의 전화에서 : 카운터는 SMS가 이제 3 개의 SMS를 사용한다고 말합니다. 문자열 크기가 두 배로 증가했습니다.

결론 : A의 전화기에서 기본 문자 집합에는 "ç"이 포함됩니다. B의 전화기에서 "ç"가 나타나면 문자 세트가 변경되고 각 문자는 원래 공간의 두 배가 필요합니다. (또는 뭔가 빠졌습니까?)

질문 : 다른 Android 버전이 동일한 기본 문자 집합을 사용하지 않는 이유는 무엇입니까? Android에서 이러한 기본 문자 집합은 rom에 따라 다릅니다 (예 :?)? 메뉴에서 또는 루트 폰에서 직접 이러한 문자 세트를 구성/변경할 수 있습니까? 다른 문제를 쉽게 해결할 수 있습니까?

도움, 설명 또는 경험을 환영합니다 :)

답변

3

인코딩 문제가 있습니다. 설명에서 'A'는 하나의 charset에 데이터를 보내고 어떤 charset인지에 대한 정보는 포함하지 않습니다. 근본적인 원인은 두 시스템간에 확장 된 (ASCII 이외의) 문자를 전달하여 사용할 인코딩에 동의해야한다는 것입니다. 8 비트 값으로 제한되면 시스템은 동일한 코드 페이지를 사용하는 것에 동의합니다. SMS에는 7 또는 8 비트 인코딩을위한 특수 GSM 코드 페이지가 있거나 각 문자를 나타내는 데 2 ​​바이트를 사용하는 UTF-16을 사용할 수 있습니다. 250자를 입력 한 다음 하나의 확장 문자를 입력하면 표시되는 내용은 응용 프로그램에서 발생한 상황을 보여줍니다. SMS 메시지는 140 옥텟으로 제한됩니다. 8 비트 인코딩을 사용할 때 250 개의 문자가 2 개의 메시지 (250 < 280)에 적합하지만 "ç"를 추가하면 UTF-16 인코딩으로 변경되어 갑자기 모든 문자가 2 옥텟을 차지하므로 응용 프로그램이 메시지에 70자를 맞추십시오. 이제 전체 메시지를 전송하는 데 3.5 개의 SMS 메시지가 필요합니다.

안드로이드에서 SMS 메시지의 디코딩은 SmsCbMessage.java의 프레임 워크 전화 코드의 일부입니다. 그것은 언어 코드와 메시지 본문의 인코딩을 작동시킵니다.이것이 틀리면 (메시지가 영어 코드 페이지로 인코딩되었지만 확장 된 문자를 사용하는 경우) 이상한 문자가 나타날 수 있습니다.

당신이 잘못한 모바일 네트워크가 아닙니다. Android A가 유효한 SMS의 인코딩을 올바르게 식별하지 못할 수도 있지만 전화 A의 메시징 응용 프로그램이라고 판단됩니다. 나는 그것이 A와 iPhone 또는 몇몇 다른 제조사 장치 사이에서 어떻게 작동하는지 궁금해.

+0

답장을 보내 주셔서 감사합니다. A가 특수 문자가있는 메시지를 보낼 때와 동일한 결과를 다른 전화와 함께 실행했습니다. 그래서 A가 SMS를 인코딩 할 때 문제가 있다고 생각합니다. SMS/MMS 앱에서이 작업이 완료되었으며 Android 프레임 워크에서 내부적으로 수행되지 않았습니까? 어떻게 우리는 B의 전화에서 오는 응용 프로그램에 대한 A의 전화에서 응용 프로그램을 변경해도 문제가 해결되지 않았다는 사실을 설명 할 수 있습니까? – Romain360

+0

이들은 두 가지 안드로이드 장치이므로 SMS 메시지가 인코딩 된 후에 무선 레이어를 통과 할 때 실제로 SMS 메시지를 검사 할 수 있습니다. 'adb logcat -b radio | tee radio.log '를 입력하고 테스트 메시지를 보내면 – patthoyts

+0

E/RIL (133) : smsc : E/RIL (133) : strlen (pdu) = 114 (0x39), pdu : 01000c91449732832356000b2c005400650073007400 200065006e0063006f00640069006e0067002000e700200061006e0064002000e9002e 이것은 '테스트 인코딩 ç 및 é'의 utf-16 인코딩 버전입니다. 정면에 약간의 헤더 바이트가 있습니다. 우리는 이것을 파이썬 >>> x [26 :]. decode ('hex') 디코드 ('utf-16be') u'Test 인코딩 \ xe7 및 \ xe9를 사용하여 확인할 수 있습니다. 이렇게하면 라디오 레이어의 출력을 검사 할 수 있습니다. 라디오 레이어는 휴대폰에서 나가기 전에 잘못 인코딩 된 것으로 표시되어야합니다. – patthoyts

0

SMS 유니 코드 응용 프로그램에서 몇 가지 특수 문자를 표시해야 할 때 동일한 문제가 발생했습니다. 필자가 사용한 방법은 sm으로 보내야하는 문자열을 for 루프에서 실행하여 각 문자를 가져 와서 ascii 코드를 찾고 해당 정수 값을 사용하여 구분 기호를 사용하여 해당 문자열을 인코딩하는 것입니다. 이 문자열은 sms로 전송할 수 있습니다. 전송에 사용되는 것과 동일한 구분 기호를 사용하여 디코딩 한 다음 ASCII 문자 코드를 문자 (언어 별)로 변환하고 변환 된 문자를 추가하여 문자열을 만듭니다. 이 텍스트는 SMS로 보낸 텍스트와 동일합니다.

감사합니다.