我对 iOS 上的 iswalpha()
有疑问。
我正在 Xcode 4.5 中调整我的应用程序,我试图将西类牙字符 ú
传递给 iswalpha()
。 xcode 显示 ú
的 int 值为 250。
当我尝试在真实设备上运行该应用程序时,iswalpha()
返回 0;但在模拟器中(我在装有 10.8.2 的 MacBook air 上运行 Xcode)它返回 1。
我猜原因可能是 iOS 的宽字符实现与 MacOS 不同。解决此问题的最佳方法是什么?
增强的细节:
西类牙字符 ú
的 UTF-16(unicode) 编码在 int 值中为 250。我认为 iswalpha() 应该像 MACOS 一样返回 1,而不是在 iOS 中返回 0。
大妈新用户不能在这里张贴图片。所以ú
的UTF-16编码请引用:
http://www.fileformat.info/info/unicode/char/fa/index.htm
最佳答案
好吧,我现在可以回答我自己的问题,还有一个开发日志,以防我以后忘记:
看来是Apple在iOS中实现libc的错误。考虑到非英语语言的字母,iswalpha() 的实现是不完整的。 iswalpha() 无法识别不同语言中的特定字母(ú,á,ó,...),因为它们超出了 0x7F ASCII 边界,不知何故无法被 iOS 的语言环境处理函数识别,但显然在不同的语言环境中,它们仍然应该是可读的字母。
关于它的一些细节:
iOS 中的 iswalph() 被追踪到:
__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 */
}
最后返回 0 的是 __maskrune(_c, _f))。
Apple 忽略了这一点是可以理解的,因为没有人会在 Objective-C 中使用 iswalpha()。但是,对于某些移植项目,注意这一点可能仍然有用。这是一个广泛使用的功能,因此对于许多移植到 iOS 的遗留项目来说可能很重要。希望 Apple 可以在以后的版本中修复它。
我现在解决这个问题的方法是使用 iswalpha() 的包装函数,它通过我自己的代码处理这些拉丁字母。现在该应用程序在我的 iPhone 中完美运行!
关于ios - iOS 中的 iswalpha() 在 iOS 上返回的值与在 MacOS 上返回的值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889982/