2012-12-15 1 views
1

iOS에서 iswalpha()에 대한 문제가 있습니다.iOS의 iswalpha()가 MacOS에서 iOS와 동일한 값을 반환하지 않습니다.

Xcode 4.5에서 응용 프로그램을 조정하고 스페인어 문자 úiswalpha()으로 전달하려고했습니다. 엑스 코드는 ú의 int 값은 내가 실제 장치에서 응용 프로그램을 실행하려고 250

, iswalpha() 반환 0 표시; 하지만 시뮬레이터 (MacBook Air 10.8.2에서 Xcode를 실행합니다.)는 1을 반환합니다.

이유는 iOS가 MacOS와는 다른 와이드 문자 구현을 가지고 있기 때문일 수 있습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

향상된 세부 : 스페인어 문자 ú 은 UTF-16 (유니 코드) 인코딩 int 값 250이다. MACOS처럼 iOS에서 0을 반환하는 것 이외에 iswalpha()가 1을 반환한다고 생각합니다.

댐 새 사용자가 여기에 이미지를 게시 할 수 없습니다. 너무 ú의 UTF-16 인코딩을 참조하십시오 : 이 http://www.fileformat.info/info/unicode/char/fa/index.htm

답변

2

그럼 난 지금 내 자신의 질문에 대답 할 수있는 경우에 개발 로그뿐만 아니라,이 나중에 잊어 버렸 :

잘못이 될 것으로 보인다 iOS에서 애플이 libc를 구현했다. iswalpha()의 구현은 영어 이외의 언어로 된 글자를 고려할 때 불완전합니다. 다른 언어의 특정 문자 (ú, á, ó, ...)는 0x7F ASCII 경계에서 벗어나기 때문에 iswalpha()에서 인식 할 수 없으며 iOS의 로켈 처리 함수로 인식 할 수 없기 때문에, 그러나 분명히 다른 로케일에서 그들은 여전히 ​​읽을 수있는 알파벳 문자이어야합니다. 그것에 대해

일부 세부 정보 :

iswalph() 아이폰 OS가 아래로 추적 :

__DARWIN_CTYPE_static_inline int 
__istype(__darwin_ct_rune_t _c, unsigned long _f) 
{ 
#ifdef USE_ASCII 
    return !!(__maskrune(_c, _f)); 
#else /* USE_ASCII */ 
    return (isascii(_c) ? !!(_DefaultRuneLocale.__runetype[_c] & _f) 
     : !!__maskrune(_c, _f)); 
#endif /* USE_ASCII */ 
} 

하고 __maskrune입니다 (_C는 _f)) 결국이 0

반환

애플은 Objective-C에서 iswalpha()를 사용할 것이므로이 시점을 놓쳤다는 것을 이해할 수 있습니다. 그러나 일부 포팅 프로젝트에 대해서는이 점을 유의하는 것이 여전히 유용 할 수 있습니다. 널리 사용되는 기능 이었기 때문에 iOS로 이식하는 많은 레거시 프로젝트에 중요했습니다. 희망은 애플이 나중에 릴리스에서 해결할 수 있습니다.

이 문제의 해결 방법은 iswalpha()의 래퍼 함수를 ​​사용하여이 라틴 문자를 내 코드로 처리하는 것입니다. 이제 앱이 내 iPhone에서 완벽하게 실행됩니다!

+0

Apple에 버그로 로그인해야합니다! – lnafziger

+0

@Inafziger : 감사합니다. 나는이 문제가 영향을 미칠 것으로 추측했기 때문에 아마도 그렇게 할 것입니다. UITextView/UILabel 또한 __istype()을 많이 호출하는 것으로 보이며 내부 NSString의 유니 코드 인코딩 (UITextView/UILabel의 기본 인코딩)에는 실제 iOS 장치의 라틴 문자가 MACOS 시뮬레이터와 매우 다르다는 것을 알 수 있습니다. 나는 라틴 문자를 정확히 취급하는 iOS가 지금 얼마나 정확한지 알아내는 시간이 필요하다는 것을 의문의 여지가 없다. 그러나 유니 코드를 사용하지 않으려면 현명한 선택 인 것 같습니다. 가능한 한 UTF-8을 사용하십시오. – Roland

관련 문제