6

私は Excel プラグインを作成しており、Excel のwchar_t 出力を生成する必要があります (ただし、内部的には 100%であり、実際にはプレーン ASCII にchar制限されています)。charある時点で、私は swprintf変換を行うために使用しています:

static wchar_t buffer[ 32369 ];
buffer[0] = swprintf( buffer + 1, sizeof(buffer) - 1, L"#%s!", message );

Excel はある種の CJK 文字を表示しますが、message (type char const*) は印刷可能な ASCII (16 進値 0x20-0x7E) 以外の文字を含まない null で終了する文字列です。

私はこれを小さなテストプログラムで試し、生成された文字列を 16 進数でダンプしましたが、VC++ はmessage それが であるかのように扱っているように見えます (ただし、1 バイトですが、正しくwchar_t const*認識されているようです)。'\0'これは、(私が期待してい たものではなく)のwchar_tような値になります。0x65680x0068, 0x0065

C99 標準によれば、"%s"指定子 の場合、「関数 [...] を繰り返し呼び出すかのようswprintfに」から文字を変換する必要があります。表示されている動作は Visual C++ ライブラリのエラーですか、それともグローバル ロケールに変更が必要なものがあるのでしょうか?char const*mbrtowc

(FWIW: g++ を使用して小さなテスト プログラムをコンパイルして実行すると、期待どおりの動作が得られます。ただし、G++ は Excel プラグインのオプションではありません。少なくとも現時点ではそうではありません。)

4

2 に答える 2

15

MSDN のswprintfから次のことに注意してください。

swprintf は sprintf のワイド文字バージョンです。swprintf へのポインタ引数はワイド文字列です。

そして、例では:

wchar_t buf[100];
int len = swprintf( buf, 100, L"%s", L"Hello world" );

したがって、少なくともマイクロソフトはこれを文書化しています。

そして、フォーマット指定子のページで

文字列 printf 関数で使用する場合、1 バイト文字列を指定します。wprintf 関数で使用する場合、ワイド文字列を指定します。文字は、最初のヌル文字まで、または精度の値に達するまで出力されます。

その後

S String printf 関数で使用する場合、ワイド文字列を指定します。wprintf 関数で使用する場合、1 バイト文字列を指定します。文字は、最初のヌル文字まで、または精度の値に達するまで出力されます。

したがって、必要なのは大文字%Sです。

この同様の質問も参照してください: Visual Studio swprintf により、すべての %s フォーマッタが%ls(常にパラメーターを考慮するwchar_t*) および%hs(常にパラメーターを考慮するchar*)の使用を提案するchar * の代わりに wchar_t * を必要とする

于 2013-09-10T09:48:24.570 に答える