【问题标题】:iswalpha() in iOS doesn't return the same value on iOS that it does on MacOSiOS 中的 iswalpha() 在 iOS 上返回的值与在 MacOS 上不同
【发布时间】:2012-12-03 02:55:16
【问题描述】:

我对 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

【问题讨论】:

    标签: ios widechar


    【解决方案1】:

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

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

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

    【讨论】:

    • 您应该将此作为 Apple 的错误记录!
    • @Inafziger:谢谢,我可能应该这样做,因为我刚刚意识到我可能低估了这个问题的影响。 UITextView/UILabel 似乎也经常调用 __istype(),我可以看到内部 NSString 的 unicode 编码(UITextView/UILabel 的默认编码)包括真实 iOS 设备中的拉丁字母与它们在 MACOS 模拟器中非常不同。我不知道iOS现在究竟是如何处理拉丁字母的奥秘,还需要一些时间来了解。但尽量避免使用 unicode 似乎是一个明智的选择。尽可能使用 UTF-8。
    猜你喜欢
    • 2018-03-26
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多