5

iOSでは、vswprintf欧米以外のロケールで使用すると失敗し、-1が返されます。

ただし、ロケールを正しく設定すると、正しく書き込まれます。

どうしてこれなの?何か案は?

4

1 に答える 1

10

不思議なことに、 vswprintfiOSでの実装は、与えられたワイド文字列引数をナロー文字列に変換してから、結果をワイド文字列に変換し直します(この問題を一度デバッグする必要がありました)。ワイド文字列に非ASCII文字が含まれている場合、これは不可逆変換であり、特定の文字のみを正常に変換できます。

変換できる非ASCII文字の正確なセットは、現在のロケール設定によって異なります。サポートされていない文字を渡そうとすると、エラー(不正なマルチバイトシーケンス)にvswprintf戻っ-1て設定することで失敗します。errnoEILSEQ

Mac OS Xでは、少なくとも、UTF-8ロケールに切り替えることでこれを回避できます。例:

setlocale(LC_CTYPE, "UTF-8")

ただし、これはiOSでは機能しないようです。したがってvswprintf、事前にロケールを知らなくてもすべてのキャラクターを操作できるようにする必要がある場合は、vswprintf自分で再実装しない限り、運が悪いと思います。

于 2012-07-30T02:16:06.837 に答える