음; '호환성이슈'이라는 항목으로 올리는게 맞는지 모르겠습니다만...
기존에 XDADevelopers 사이트에서 포팅해놓은 HTC WinMo 기기들의 한국 SMS 포팅 관련 문제가 있어서 이렇게 포스팅합니다.

실제로 저는 Xperia X1 (HTC Kovsky)를 가지고 있으며
xdandoid를 이용해 Froyo 버젼 제 스마트폰에 사용중입니다.

한국 SMS 문제를 정리하면 다음과 같습니다
  • SMS 수신오류 - 잘못된 전화번호 / 메세지 없음
  • SMS 발신오류 - 메세지 내용 깨짐 (인코딩 문제)
결론부터 말씀드리면 문제의 원인은 SKT, KTF가 GSM SMS 기준을 약간? 어겼기 때문입니다. (완전이 어긴건 아니지만서도;;;)

GSM SMS의 전송 규칙은 음... 네트워크의 DataGram같은 일종의 데이터 형식을 따르는데 이를 PDU라고 부릅니다.
PDU(Protocol Data Unit)는 SMS를 전송할 때 일종의 데이터 포맷인데 3GPP라는 기관에서 정한다고 합니다.

문자가 왔을 때 전송되는 SMS-DELIVERY PDU 문자열을 예로들면,
"0791280102198188440AA15117180890000401802291018263130A22080B811040309814F761623132B0A1B3AA"
이런식으로 PDU 문자열이 날아옵니다

이 PDU를 조각조각 분해하면 다음과 같은 결과가 나옵니다.
이전에 제가 안드로이드펍에서 SMS 분석 슬라이드를 본적이 있는데 링크를 까먹어서;
무책임하지만 그 슬라이드를 찾아서 확인해 보시면 매우 자세하게 SMS PDU구조가 나옵니다.

07 // SMSC octet size = 7
91 // type-of-address of the SMSC
280102198188 // service center +82102091888
44 // TP-UDHI(UserDataHeaderIndicator), TP-MMS(More messages to send)
0A // length of sender number
A1 // 1010 0001, national number/isdn/telephone numbering plan
5117180890 // 1571818009
00 // Protocol Identifier
84 // Data Coding Scheme 1000 0100
01802291018263 // 2010/08/22 19:10:28
13 // (User Data) length, 0x13 = 19
0A // (User Data) Header octet size = 10
22 // (User Data) type-of-address(toa)
08 // (User Data) type-of-protocol(TP)
0B // (User Data) length of local phone number, 0x0b = 11
81 // (User Data) 1000 0001, unknown/telephone numbering plan
101021436587 // (User Data), sender number 01012345678
61623132B0A1B3AA // (User Data) text message "ab12가나"

만일 이 SMS-DELIVERY PDU를 국내 SMS 처리가 안된 안드로이드 소스로 처리하게 되면
    발신자: 1571818009
    내용:(내용없음)
이런 식으로 SMS 가 도착합니다. 실제 발신자는 01012345678이고 내용은 "ab12가나"임에도 불구하고 말이죠;

이제 문제를 밝혀봅시다

  1. 수신 문제의 첫번째 '메세지 없음'은 위에 빨간색으로 표시한 두부분에 의해서 발생합니다
첫째로 Data Coding Scheme에 0x80 비트는 미래를 위해 남겨놓은 그룹지정 비트입니다.
따라서 외국에서 개발된 소스에는 저 그룹지정 비트에 대한 어떠한 언급도 없죠. 그냥 Unknown Encoding Scheme입니다;
당연히 모르는 타입의 메세지를 더이상 처리안하고 넘어가는 경우가 많습니다. 따라서 메세지 수신시에 어떠한 내용도 표시되지 않죠;

=> RIL code에서 저 Data Coding Scheme을 처리해주던가
=> 또는 안드로이드 프레임워크내의 Telephony 소스에서 저 Data Coding Scheme에 대해서 처리할 수 있도록 변경해줘야합니다.

  2. 이상한 번호로 문자가 오는 문제는 위에 파란색으로 표시한 부분에 의해 발생합니다.
위의 PDU 예에 따르면 보낸사람 번호는 "1571818009"이지 "01012345678"이 아닙니다;
당연히 문자를 보낸사람은 "1571818009"로 표시가 됩니다; 그리고 국내에서 사용한 전화번호는 밑에 User Data Header에 숨겨져 있네요;

=> Data Coding Scheme & 0x80 혹은 User DataHeaderNumberingPlan & 80 이라면 User Data Header에서 보낸사람 주소를 꺼내서 표시해줘야합니다. 이것도 역시 RIL SMS 코드내에서 수정을 하던가 혹은 안드로이드 Telephony 코드를 수정해야합니다

  3. 보너스 문제로 한국어 인코딩 문제가 있습니다.
위 PDU 예에서 텍스트 메세지 "61623132B0A1B3AA" 가 "ab12가나"로 해석되어야합니다.
그런데 "61623132"는 쉽게 해석이 됩니다. 0x61 => 'a', 0x31 => '1' 이 부분은 ASCII 코드이면서 동시에 UTF-8 코드로 해석될 수 있죠.
문제는 "B0A1B3AA"가 왜 "가나"로 해석되냐 입니다. 실제로 GSM SMS 표준에 따르면 Data Coding Scheme으로 3가지가 가능합니다
  1. GSM7bit (Default 7bit 문자셋에 기반한 7bit 코딩입니다. 자세한건 패스;)
  2. 8bit (UTF-8)
  3. 16bit (UCS-2)
그러면 "61623132"같은 8bit 단위 문자에 따라서 "B0A1B3AA"도 UTF-8 코딩으로 해석하면 될까요? 그렇지 않습니다.
UTF-8 코딩에 따르면 "가나"같은 문자는 한 문자당 3byte로 변환이 됩니다;
위에 "B0A1B3AA"는 실제로 EUC-KR (KSC5601) 코딩을 사용하고 있습니다.
당연히 위에 GSM SMS의 Data Coding Scheme 표준에 따르지 않으므로 한글은 깨져서 해석이 됩니다;
이 문제를 해결하면 문자를 받았을 때 글자가 깨지는 문제가 없어지겠죠.

=> Data Coding Scheme & 0x80 이라면 메세지 내용을 EUC-KR => UTF-8 혹은 UCS-2 변환해야합니다
다행히도 C로 개발시에는 안드로이드 소스의 external/icu4c를 사용하시면 되고
Java에서는 스트링을 읽을때 String(text, "KSC5601") 하시면 될겁니다.


여기까지가 제가 문제를 확인하고 분석한 결과입니다.
마지막으로, 만일 SMS 소스 부분의 작업이 필요하시면 안드로이드 프레임워크내의 Telephony코드를 수정하라고 권해드리고 싶네요.
왜냐하면 어떤 스마트폰이냐에 상관없이 수정해야하는 SMS 코드이기 때문입니다.
음; 그러나 저는 불행히도 제가 빌드하지 않은 안드로이드 system.img를 사용하고 있기 때문에 RIL 코드를 수정해야 했습니다.
HTC ril 소스 부분은 정말 버그가 많네요; 제가 능력이 된다면 xdandroid 부분에 htc-ril 관련 소스 코드를 바로잡고 싶습니다.
기회가 될런지 모르겠네요.

틀린 부분이 있으면 지적해주시고
게시판을 잘못 찾아왔다면 역시 지적해주시고
뭔가 궁금한 부분이 있으시면 역시 질문해주시길 바랍니다.
그럼 저로인해 삽질이 조금이라도 줄어들기를 바라며 이만 줄입니다.