Windows PC로부터 받아온 문자열 데이터를 사용하기 위해 NSString으로 변환하니 문자가 깨져버렸다. 이유를 찾아보니, Encoding이 맞지 않아서였다.
그래서 위해 개발자 문서에 나온 모든 Encoding 타입을 적용하였지만, 원하는 결과가 나오지 않았다.
Apple에서 iPhone에는 제공하지 않는 것일까?
그래서 MAC Application을 간단히 만들어 테스트 해보았다.
MAC OS에서는 [NSString stringWithFormat:@"%s", anyString];
위와 같이 처리하면 자동으로 변환이 되었다. 하지만 유독 iPhone에서만 안되는 것일까?
처리 방법은 아래 레퍼런스를 참고하면 된다.
한글, 중국어, 일본어 등 여러 2bytes 문자들에 대해서 정의해놓은 encoding이다.
한글의 경우, 0x80000003으로 정의되어 있는 것을 알 수 있다. 즉,
[NSString stringWithCString:anyString encoding:0x80000003];
과 같이 처리하면 원하는 결과를 얻을 수 있다.
실제 접했던 문제에 대한 예를 들어 설명해보자.
Windows PC에서 수신 데이터의 메모리 값이 다음과 같았다.
0xBF 0xC0 0xC8 0xC4
이 데이터는 한글로 '오후'이다.
해당 데이터를 잘라낸 다음 버퍼에 넣고, 그 뒤로 0x00 널문자를 2바이트 추가 한다.
그리고 위의 방법과 같이 0x80000003 Encoding을 사용하면 원하는 결과를 얻을 수 있다.
<출처 : OSXDEV Forum>
NSString의 인코딩
NSString은 내부적으로 모두 유니코드로 저장된다. 하지만, NSString에 문자열을 넣거나 뺄때 유니코드가 아닌 다른 인코딩을 사용할 수 있다.
NSString이 기본적으로 지원하는 인코딩은 NSString.h에 다음과 같이 선언되어 있다.
typedef unsigned NSStringEncoding; enum { NSASCIIStringEncoding = 1, /* 0..127 only */ NSNEXTSTEPStringEncoding = 2, NSJapaneseEUCStringEncoding = 3, NSUTF8StringEncoding = 4, NSISOLatin1StringEncoding = 5, NSSymbolStringEncoding = 6, NSNonLossyASCIIStringEncoding = 7, NSShiftJISStringEncoding = 8, NSISOLatin2StringEncoding = 9, NSUnicodeStringEncoding = 10, NSWindowsCP1251StringEncoding = 11, /* Cyrillic; same as AdobeStandardCyrillic */ NSWindowsCP1252StringEncoding = 12, /* WinLatin1 */ NSWindowsCP1253StringEncoding = 13, /* Greek */ NSWindowsCP1254StringEncoding = 14, /* Turkish */ NSWindowsCP1250StringEncoding = 15, /* WinLatin2 */ NSISO2022JPStringEncoding = 21, /* ISO 2022 Japanese encoding for e-mail */ NSMacOSRomanStringEncoding = 30, NSProprietaryStringEncoding = 65536 /* Installation-specific encoding */ };
하지만, NSString은 실제로 Mac OS에서 사용할 수 있는 모든 인코딩을 지원한다.
다음은 NSString클래스의 인코딩관련 메쏘드들이다.
/* 사용자 기본 인코딩을 구한다 */ + (NSStringEncoding)defaultCStringEncoding; /* NSString에서 사용가능한 모든 인코딩을 구한다 */ + (const NSStringEncoding *)availableStringEncodings; /* 인코딩의 이름을 구한다 */ + (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding; /* 현재 스트링을 변환시 가장 빠르거나 메모리가 적게 드는 인코딩을 구한다 */ - (NSStringEncoding)fastestEncoding; - (NSStringEncoding)smallestEncoding; /* 데이터의 손실없이 해당 인코딩으로 변환 가능한지 여부를 알아본다 */ - (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding; /* 해당 인코딩의 데이터로부터 NSString을 생성한다 */ - (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding; /* 현재 스트링을 해당 인코딩의 데이터로 변환하여 얻는다 */ - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy; - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding; /* lossy=NO */
다음의 코드를 사용해서 NSString에서 지원하는 모든 인코딩의 이름과 그 값을 알 수 있다.
NSStringEncoding *encoding = [NSString availableStringEncodings]; while (*encoding) { NSLog(@"%@ %x", [NSString localizedNameOfStringEncoding:*encoding], *encoding); encoding++; }
다음은 NSString에서 지원하는 인코딩들이다.
Western (Mac OS Roman) | 0x1e | 30 | 30 |
Japanese (Mac OS) | 0x80000001 | 2147483649 | -2147483647 |
Traditional Chinese (Mac OS) | 0x80000002 | 2147483650 | -2147483646 |
Korean (Mac OS) | 0x80000003 | 2147483651 | -2147483645 |
Arabic (Mac OS) | 0x80000004 | 2147483652 | -2147483644 |
Hebrew (Mac OS) | 0x80000005 | 2147483653 | -2147483643 |
Greek (Mac OS) | 0x80000006 | 2147483654 | -2147483642 |
Cyrillic (Mac OS) | 0x80000007 | 2147483655 | -2147483641 |
Devanagari (Mac OS) | 0x80000009 | 2147483657 | -2147483639 |
Gurmukhi (Mac OS) | 0x8000000a | 2147483658 | -2147483638 |
Gujarati (Mac OS) | 0x8000000b | 2147483659 | -2147483637 |
Thai (Mac OS) | 0x80000015 | 2147483669 | -2147483627 |
Simplified Chinese (Mac OS) | 0x80000019 | 2147483673 | -2147483623 |
Tibetan (Mac OS) | 0x8000001a | 2147483674 | -2147483622 |
Central European (Mac OS) | 0x8000001d | 2147483677 | -2147483619 |
Symbol (Mac OS) | 0x6 | 6 | 6 |
Dingbats (Mac OS) | 0x80000022 | 2147483682 | -2147483614 |
Turkish (Mac OS) | 0x80000023 | 2147483683 | -2147483613 |
Croatian (Mac OS) | 0x80000024 | 2147483684 | -2147483612 |
Icelandic (Mac OS) | 0x80000025 | 2147483685 | -2147483611 |
Romanian (Mac OS) | 0x80000026 | 2147483686 | -2147483610 |
Keyboard Symbols (Mac OS) | 0x80000029 | 2147483689 | -2147483607 |
Farsi (Mac OS) | 0x8000008c | 2147483788 | -2147483508 |
Cyrillic (Mac OS Ukrainian) | 0x80000098 | 2147483800 | -2147483496 |
Western (Mac VT100) | 0x800000fc | 2147483900 | -2147483396 |
Unicode™ (UTF-16) | 0xa | 10 | 10 |
Unicode™ (UTF-8) | 0x4 | 4 | 4 |
Western (ISO Latin 1) | 0x5 | 5 | 5 |
Central European (ISO Latin 2) | 0x9 | 9 | 9 |
Western (ISO Latin 3) | 0x80000203 | 2147484163 | -2147483133 |
Central European (ISO Latin 4) | 0x80000204 | 2147484164 | -2147483132 |
Cyrillic (ISO 8859-5) | 0x80000205 | 2147484165 | -2147483131 |
Arabic (ISO 8859-6) | 0x80000206 | 2147484166 | -2147483130 |
Greek (ISO 8859-7) | 0x80000207 | 2147484167 | -2147483129 |
Hebrew (ISO 8859-8) | 0x80000208 | 2147484168 | -2147483128 |
Turkish (ISO Latin 5) | 0x80000209 | 2147484169 | -2147483127 |
Nordic (ISO Latin 6) | 0x8000020a | 2147484170 | -2147483126 |
Thai (ISO 8859-11) | 0x8000020b | 2147484171 | -2147483125 |
Baltic Rim (ISO Latin 7) | 0x8000020d | 2147484173 | -2147483123 |
Celtic (ISO Latin 8) | 0x8000020e | 2147484174 | -2147483122 |
Western (ISO Latin 9) | 0x8000020f | 2147484175 | -2147483121 |
Latin-US (DOS) | 0x80000400 | 2147484672 | -2147482624 |
Greek (DOS) | 0x80000405 | 2147484677 | -2147482619 |
Baltic Rim (DOS) | 0x80000406 | 2147484678 | -2147482618 |
Western (DOS Latin 1) | 0x80000410 | 2147484688 | -2147482608 |
Central European (DOS Latin 2) | 0x80000412 | 2147484690 | -2147482606 |
Turkish (DOS) | 0x80000414 | 2147484692 | -2147482604 |
Icelandic (DOS) | 0x80000416 | 2147484694 | -2147482602 |
Arabic (DOS) | 0x80000419 | 2147484697 | -2147482599 |
Cyrillic (DOS) | 0x8000041b | 2147484699 | -2147482597 |
Thai (Windows, DOS) | 0x8000041d | 2147484701 | -2147482595 |
Japanese (Windows, DOS) | 0x8 | 8 | 8 |
Simplified Chinese (Windows, DOS) | 0x80000421 | 2147484705 | -2147482591 |
Korean (Windows, DOS) | 0x80000422 | 2147484706 | -2147482590 |
Traditional Chinese (Windows, DOS) | 0x80000423 | 2147484707 | -2147482589 |
Western (Windows Latin 1) | 0xc | 12 | 12 |
Central European (Windows Latin 2) | 0xf | 15 | 15 |
Cyrillic (Windows) | 0xb | 11 | 11 |
Greek (Windows) | 0xd | 13 | 13 |
Turkish (Windows Latin 5) | 0xe | 14 | 14 |
Hebrew (Windows) | 0x80000505 | 2147484933 | -2147482363 |
Arabic (Windows) | 0x80000506 | 2147484934 | -2147482362 |
Baltic Rim (Windows) | 0x80000507 | 2147484935 | -2147482361 |
Vietnamese (Windows) | 0x80000508 | 2147484936 | -2147482360 |
Western (ASCII) | 0x1 | 1 | 1 |
Japanese (Shift JIS X0213) | 0x80000628 | 2147485224 | -2147482072 |
Chinese (GBK) | 0x80000631 | 2147485233 | -2147482063 |
Chinese (GB 18030) | 0x80000632 | 2147485234 | -2147482062 |
Japanese (ISO 2022-JP) | 0x15 | 21 | 21 |
Korean (ISO 2022-KR) | 0x80000840 | 2147485760 | -2147481536 |
Japanese (EUC) | 0x3 | 3 | 3 |
Simplified Chinese (EUC) | 0x80000930 | 2147486000 | -2147481296 |
Traditional Chinese (EUC) | 0x80000931 | 2147486001 | -2147481295 |
Korean (EUC) | 0x80000940 | 2147486016 | -2147481280 |
Japanese (Shift JIS) | 0x80000a01 | 2147486209 | -2147481087 |
Cyrillic (KOI8-R) | 0x80000a02 | 2147486210 | -2147481086 |
Traditional Chinese (Big 5) | 0x80000a03 | 2147486211 | -2147481085 |
Western (Mac Mail) | 0x80000a04 | 2147486212 | -2147481084 |
Traditional Chinese (Big 5 HKSCS) | 0x80000a06 | 2147486214 | -2147481082 |
Western (NextStep) | 0x2 | 2 | 2 |
Non-lossy ASCII | 0x7 | 7 | 7 |
Western (EBCDIC US) | 0x80000c02 | 2147486722 | -2147480574 |
표에서 알 수 있듯이 NSString.h에서 선언되어 있지 않은 인코딩은 CFString의 인코딩 번호에 0x80000000를 더한 값이다.
출처 : http://blog.backpackholic.tv/160?category=26
'□컴퓨터 관련 > ★iPhone Developer' 카테고리의 다른 글
iOS5 Tech Talk World In Seoul (0) | 2011.12.11 |
---|---|
[아이폰 개발]Swipe 기능 (0) | 2011.08.26 |
UITextView 설정하기! (0) | 2011.01.25 |
Google AdMob (0) | 2011.01.21 |
IPHONE 에서 국가 설정 값 및 언어 설정 값 가져 오는 법. (0) | 2011.01.21 |
iPhone 어플리케이션을 앱스토어에 배포하는 과정 (0) | 2011.01.17 |
자주 쓰는 NSString Method (0) | 2010.12.20 |