1

iswalpha()iOSで問題があります。

私は Xcode 4.5 でアプリを調整しており、スペイン語の文字úをに渡そうとしましたiswalpha()。xcode は、ú250 の int 値を表示します。

実際のデバイスでアプリを実行しようとすると、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 を参照して ください。

4

1 に答える 1

2

後でこれを忘れた場合に備えて、開発ログと同様に、今すぐ自分の質問に答えることができます。

Apple による iOS での libc の実装に問題があるようです。iswalpha() の実装は、英語以外の言語の文字を考慮すると不完全です。さまざまな言語の特定の文字 (ú、á、ó、...) は、0x7F ASCII 境界から外れるため、iswalpha() によって認識できませんでした。また、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)) です。

Objective-C で iswalpha() を使用する人はいないため、Apple がこの点を見逃していることは理解できます。ただし、一部の移植プロジェクトでは、この点に注意することが引き続き役立つ場合があります。これは広く使用されている機能であり、iOS に移植する多くのレガシー プロジェクトにとって重要かもしれません。Appleが後のリリースで修正できることを願っています。

この問題に対する私の回避策は、iswalpha() のラッパー関数を使用することです。これは、これらのラテン文字を独自のコードで処理します。今、アプリは私の iPhone で完璧に動作します!

于 2012-12-15T19:25:36.737 に答える