1

iswalpha()我在 iOS 上有一个问题。

我正在 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。

Dam 新用户无法在此处发布图片。所以对于UTF-16编码ú请参考: http ://www.fileformat.info/info/unicode/char/fa/index.htm

4

1 回答 1

2

好吧,我现在可以回答我自己的问题,以及一个开发日志,以防我后来忘记了:

这似乎是苹果在 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 的许多遗留项目来说可能很重要。希望苹果可以在以后的版本中修复它。

我现在解决这个问题的方法是使用 iswalpha() 的包装函数,它通过我自己的代码处理这些拉丁字母。现在,该应用程序在我的 iPhone 上完美运行!

于 2012-12-15T19:25:36.737 回答