3

これはOSXで発生しますが、UNIX-yOSには当てはまると思います。私はこのように見える2つの文字列を持っています:

const wchar_t * test1 =(const wchar_t *) "\ x44 \ x00 \ x00 \ x00 \ x73 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00";
const wchar_t * test2 =(const wchar_t *) "\ x44 \ x00 \ x00 \ x00 \ x19 \ x20 \ x00 \ x00 \ x73 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00";

デバッガーでは、test1は「D」のように見え、test2は「D」のように見えます(カーリーアポストロフィ付き)。次に、このコードを呼び出します。

wchar_t buf1 [100]、buf2 [100];
int ret1 = swprintf(buf1、100、L "%ls"、test1);
int ret2 = swprintf(buf2、100、L "%ls"、test2);

最初のswprintf呼び出しは正常に機能します。2番目のものは-1を返します(そしてバッファーは変更されません)。

問題はロケールに関係していると思いますが、グーグルで調べても何も役に立ちませんでした。これは、私が見ている問題を再現する最も簡単な方法です。私が本当に興味を持っているのはvswprintf()ですが、それは密接に関連していると思います。

swprintfが8ビット範囲外のUnicode文字でチョークするのはなぜですか?とにかくこれを回避する方法はありますか?

4

1 に答える 1

5

ロケールをUTF-8に明示的に設定してみてください。

setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...
于 2010-06-21T15:12:22.253 に答える