iOSでは、vswprintf
欧米以外のロケールで使用すると失敗し、-1が返されます。
ただし、ロケールを正しく設定すると、正しく書き込まれます。
どうしてこれなの?何か案は?
iOSでは、vswprintf
欧米以外のロケールで使用すると失敗し、-1が返されます。
ただし、ロケールを正しく設定すると、正しく書き込まれます。
どうしてこれなの?何か案は?
不思議なことに、 vswprintf
iOSでの実装は、与えられたワイド文字列引数をナロー文字列に変換してから、結果をワイド文字列に変換し直します(この問題を一度デバッグする必要がありました)。ワイド文字列に非ASCII文字が含まれている場合、これは不可逆変換であり、特定の文字のみを正常に変換できます。
変換できる非ASCII文字の正確なセットは、現在のロケール設定によって異なります。サポートされていない文字を渡そうとすると、エラー(不正なマルチバイトシーケンス)にvswprintf
戻っ-1
て設定することで失敗します。errno
EILSEQ
Mac OS Xでは、少なくとも、UTF-8ロケールに切り替えることでこれを回避できます。例:
setlocale(LC_CTYPE, "UTF-8")
ただし、これはiOSでは機能しないようです。したがってvswprintf
、事前にロケールを知らなくてもすべてのキャラクターを操作できるようにする必要がある場合は、vswprintf
自分で再実装しない限り、運が悪いと思います。