ios - iOS 中的 iswalpha() 在 iOS 上返回的值与在 MacOS 上返回的值不同

标签 ios widechar

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

相关文章:

c - 整数,printf : is there a way to write an integer as a wide char to console without locale. h?

c - fwprintf 省略宽字符

c - 为什么没有“unsigned wchar_t”和“signed wchar_t”类型?

c++ - iostreams - 打印 `wchar_t` 或 `charXX_t` 值作为字符

ios - 如何让语音合成器一个接一个地说出一堆话语?

ios - 在 swift 2.3 中将 UIImage 转换为 Base64

ios - presentingViewController 显示为 null

ios - 使用解析 Swift 的表格单元格未按顺序排列

ios - 使用 CoreGraphics 绘制半圆

c++ - WideCharToMultiByte 问题