質問

これはOS Xで発生しますが、UNIX-Y OSには当てはまると思います。私は次のように見える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は「ds」のように見え、test2は「ds」のように見えます(巻き毛のアポストロフィを使用)。次に、このコードを呼び出します。

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文字で窒息するのはなぜですか?とにかくこれを回避することはありますか?

役に立ちましたか?

解決

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

setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top