BLOG main image
LEEEJONG (165)
IT (53)
주관적평가 (31)
창작공간 (80)
109,971 Visitors up to today!
Today 5 hit, Yesterday 57 hit
daisy rss
tistory 티스토리 가입하기!
'nsstring'에 해당되는 글 3건
2017.09.05 14:02


몇 해 전 iOS앱개발을 시작하면서부터 궁금했던 NSString/ NSLog / NS블라블라 의 정체를 우연히 

Objective C 입문서에서 발견해서 그 내용을 옮겨본다.


이전에 이야기했듯이 오브젝티브씨는 아주 약간 특별한 양념을 친 C와 같기 때문에 원한다면 NSLog대신 printf를 그냥 쓸 수도 있다. 그러나 시간과 날짜가 함께 출력되는 기능이나 새 라인 문자를 자동으로 넣어주는 등 부가적인 기능이 있으니 NSLog를 사용하기를 추천합니다.


NSLOG라는 함수 이름이 좀 낯설게 느껴질 수 있다. 함수 이름의 NS는 무슨 의미일까? 읽더보면 코코아의 모든 함수 상수 타입 이름에  NS가 앞에 붙는 것을 볼 수 있다. 이 접두사는 함수가 다른 툴킷에서 온 것이 아니라 코코아에서 왔다는 것을 알려준다.


이런 접두사는 같은식별자가 두 개의 다른 대상에 쓰일 때 결과적으로 큰 문제가 되는 이름 충돌 (name collisions) 사태를 막는데 도움이 된다. 만일 코코아가 Log()라는 이름의 함수를 가지고 있다면 이를 잘 알지 못하는 프로그래머가 어딘가에서 만든 Log라는 함수와 이름이 충돌할 수 있다. Log함수를 가지고 있는 프로그램이 코코아를 포함하면 XCode는 L:og가 여러번 정의되었다고 투덜댈 것이고 에러가 나타난다.


이제 접두사를 사용하는 것이 왜 좋은지 알게 되었다. 그런데 이번에는 다른 의문이 생길 것이다. 예를 들어, 왜 cocoa를 접두사로 쓰지 않고 NS를 사용했을까?  NS접두사는  이 툴킷이 NextSTEP이라고 불리며 NeXT Software의 제품이었던 때로 거슬러 올라간다. NextSTEP을 위해 이미 작성된 코드와으이 호환을 유지하기 위해 애플은 NS 접두사를 계속 쓰고 있다.

중략


그래서 우리는 여기서 개발할때 접두사로 NS를 써서는 안된다.


출처: 오브젝티브 C 아이폰과 맥 OSX 개발을 위한 / 마크 달림플, 스콧 내스터 지음 / 이종웅, 박세현 옮김 / apress, bj퍼블릭 23페이지


자 요약들어간다.


NS는 NextSTEP 회사이름이고, 걍 스트링 인티저 로그 뭐시기 등등에 NEXTSTEP에서 뭐 추가해서 만든 NS블라블라 클래스가 있고 거기에 추가 기능들이 들어있으니 우리는 그걸 사용한다.

뭐 이런느낌으로 받아들여야 겠다.


걍 내가 인지하는 int string 등은 C의 함수형이라고 이해하고 넘어가야겠다.


이걸읽는 Swift개발자님들 짜증나시죠

그냥 String 을 쓸때 NSStirng으로 치환해서 사용해야한다.. 정도로 외워두고 갑시다.


정리끗

Name
Password
Homepage
Secret
2015.05.06 20:35



try this.



let responseString = NSString(data: data, encoding:
CFStringConvertEncodingToNSStringEncoding( 0x0422 ) )




0x0422 means EUC-KR or CP949


NSString gets only known Encoding types, so you've to convert CFString Encoding type to NSString Encoding type.


Have fun.

Name
Password
Homepage
Secret
2015.05.06 20:32



 0x0422


웹서버가 보낼때 euc-kr로 보내는데


ios에서 NSString으로 못받아온다.


NSString(data:data, encoding: NSUtf8StringEncoding)


이거로가져오면 디코딩이 안된다.


그래서 삽질하기를 수시간.


Reference를 보니 NSStringEncoding은 기존 CFString Encoding type으로 대체가 가능하다고 한다.


CFStringConvertEncodingToNSStringEncoding()이란 함수를 찾았다.



SWIFT

func CFStringConvertEncodingToNSStringEncoding( _ encoding: CFStringEncoding) -> UInt



https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFStringRef/#//apple_ref/c/tdef/CFStringEncoding

여기서 대충 CFString에서 기본으로 지원하던 인코딩들을 볼수있고


https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFStringRef/#//apple_ref/doc/constant_group/External_String_Encodings

여기서 External 인코딩들을 볼수있다.



코리안은 총 두개가 보이는데

kCFStringEncodingMacKorean = 3,

kCFStringEncodingDOSKorean = 0x0422,


요래 두개가 보인다.


위에거는 3을 써도 안되길래 아래 0x0422를 넣으니 성공



이렇게쓰면 된다.

let responseString = NSString(data: data, encoding:
CFStringConvertEncodingToNSStringEncoding( 0x0422 ) )

println(" Response Data is = \(responseString)")


우왕 퇴근

BlogIcon 한글에러ㅠㅠ | 2015.07.25 03:09 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요^^ 스위프트를 독학하고 있는 학생입니다.ㅠ
한글 문자 오류로 4시간째 씨름중인데 해결이 안되네요ㅠ

아이튠즈에서 제 앱으로 복사하여 불러온 글자와 실험을 위하 만든 같은 글자의 NSUTF8StringEncoding한 16진수 값이 다르게 나옵니다.
예를들어, 아이튠즈에서 제 앱으로 복사하여 불러온 '사자'라는 단어를 NSUTF8StringEncoding한 16진수 값은 e18489e1 85a1e184 8ce185a1 인데,
엑스코드에서 실험을 위해 임의로 만든 '사자'의 16진수 값은 ec82acec 9e90 입니다.

임의로 만든 '사자'는 url을 요청 하면 잘 되지만, 전자는 안됩니다.ㅠ
그런데 UTF-8 16진수 값을 한글로 변환해주는 사이트에서는 전자가 '사자'로 나오가 후자는 아무것도 나타나지 않습니다ㅠ

해결 방법이 없을까요ㅠㅠ
BlogIcon 리쫑v | 2015.07.25 11:38 신고 | PERMALINK | EDIT/DEL
iTUnes에서 스트링을 읽어온다
-> 그 스트링으로 URL을 만든다 (ex: 사자.jpg)
-> 그거로 웹요청을 한다

뭐 이런과정인가요?

iTunes에서 가져온 스트링이 어떤 엔코딩인지 알아야 도움을 드릴것같네요
BlogIcon 한글에러ㅠㅠ | 2015.07.25 15:14 신고 | PERMALINK | EDIT/DEL
답글 감사합니다^^ 리쫑v님께서 말씀하신 플로우가 맞습니다. 아이튠즈로 복사한 파일의 파일명으로 url을 만들어서 웹에 요청하는 구조입니다. 그런데 예를들어 사자.jpg를 txt파일에서 불러와서 요청하면 잘 되는데, (사자.jpg란 문자열이 저장된 txt파일) 아이튠즈에 복사한 사자.jpg의 파일명인 사자.jpg를 스트링으로 불러오면 웹요청이 되지 않습니다. 그래서 utf8stringencoding한 사자.jpg의 데이터 값을 println으로 찍어봤더니 txt파일에서 불러온 사자.jpg와 엑스코드 내에서 임의로 만든 "사자.jpg"라는 스트링의 데이터 값은 같은데, 아이튠즈로 복사한 파일에서 불러온 파일명 사자.jpg의 16진수 값은 앞의 두 가지 것과 다르게 나옵니다. (모두 utf8stringencoding으로 nsdata변수에 할당했습니다.) 아이튠즈에 복사하여 불러온 파일명, 사자의 16진수 값은 e18489e1 85a1e184 8ce185a1으로 출력되고, 나머지는 ec82acec 9e90으로 출력됩니다. 그리고 ec82acec 9e90값일 때는 웹요청이 잘 되지만 e18489e1 85a1e184 8ce185a1값일 때는 요청이 되지 않습니다. 그렇다면 스트링이 생성될 때의 인코딩(?) 방식이 다르다는 이야기인 것 같은데, 즉 맥에서 사자.jpg라는 파일명을 만들 때 한글 인코딩 방식이 utf8이 아니라는 결론이 나오는데, 전문지식이 없다보니 이 부분을 어떻게 해결해야할지 모르겠네요ㅠ
BlogIcon 한글에러ㅠㅠ | 2015.07.25 15:14 신고 | PERMALINK | EDIT/DEL | REPLY
답글 감사합니다^^
리쫑v님께서 말씀하신 플로우가 맞습니다. 아이튠즈로 복사한 파일의 파일명으로 url을 만들어서 웹에 요청하는 구조입니다.
그런데 예를들어 사자.jpg를 txt파일에서 불러와서 요청하면 잘 되는데, (사자.jpg란 문자열이 저장된 txt파일)
아이튠즈에 복사한 사자.jpg의 파일명인 사자.jpg를 스트링으로 불러오면 웹요청이 되지 않습니다.
그래서 utf8stringencoding한 사자.jpg의 데이터 값을 println으로 찍어봤더니 txt파일에서 불러온 사자.jpg와 엑스코드 내에서 임의로 만든 "사자.jpg"라는 스트링의 데이터 값은 같은데, 아이튠즈로 복사한 파일에서 불러온 파일명 사자.jpg의 16진수 값은 앞의 두 가지 것과 다르게 나옵니다. (모두 utf8stringencoding으로 nsdata변수에 할당했습니다.)

아이튠즈에 복사하여 불러온 파일명, 사자의 16진수 값은 e18489e1 85a1e184 8ce185a1으로 출력되고, 나머지는 ec82acec 9e90으로 출력됩니다.
그리고 ec82acec 9e90값일 때는 웹요청이 잘 되지만 e18489e1 85a1e184 8ce185a1값일 때는 요청이 되지 않습니다.

그렇다면 스트링이 생성될 때의 인코딩(?) 방식이 다르다는 이야기인 것 같은데, 즉 맥에서 사자.jpg라는 파일명을 만들 때 한글 인코딩 방식이 utf8이 아니라는 결론이 나오는데, 전문지식이 없다보니 이 부분을 어떻게 해결해야할지 모르겠네요ㅠ
좋은정보감사합니다. | 2015.10.02 16:45 신고 | PERMALINK | EDIT/DEL | REPLY
삽질할뻔하다가 한번에 검색해서 도움 얻고 갑니다. 오늘도 수고하세요.
rladudclf | 2016.02.25 13:59 신고 | PERMALINK | EDIT/DEL | REPLY
감사합니다

제인생 삽질시간을 줄여주셨습니다!!
BlogIcon 리쫑v | 2016.03.11 10:35 신고 | PERMALINK | EDIT/DEL | REPLY
My pleasure
Name
Password
Homepage
Secret
prev"" #1 next

티스토리 툴바