シングルバイト文字列にダブルバイト文字列をフォーマットするのprintfを使用して:なぜprintfはユニコードパラメータをフォーマットしないのですか?
printf("%ls\n", L"s:\\яшертыHello"); // %ls for a wide string (%s varies meaning depending on the project's unicode settings).
は明らかに、いくつかの文字は、ASCII文字として表現することができないので、時々私はダブルバイト文字の行動を見てきました「?」に変わるマーク文字。しかし、これは特定の文字に依存するようです。上記のprintfの場合、出力は次のようになります。
s:\
私は私のようなものかもしれません期待していた:私は例を失ってしまった怖いが、私は1つの文字列ときのためだと思う
s:\??????Hello
をそれはユニコード文字を遭遇し、最初のものを '?'残りをあきらめた。
私の質問は、ワイド文字列をシングルバイト文字列にフォーマットするときに起こりそうなことです。ここに書類:http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspxは「文字は最初のヌル文字まで表示されます」と述べています。しかし、私はそれを見ていない。これはprintfのバグですか、どこかに書かれているような動作です。
ありがとうございました。私のprintfを使用する選択肢を与える人から回答を
UPDATE
感謝。私は別の方法に変更しようとしていますが、私は本当に好奇心から興味を持っています。なぜprintfは信頼できる文書化された動作をしていません。まるでそれを実装した人がこれを働かせないようにしてしまったように見えます。
「%ls」ではなく書式指定子として「%S」を試しましたか? –
はい。あなたのプロジェクトにUNICODEが定義されていない場合、%Sと%lsは同じ意味を持っていると思います。 –
フォーマットの仕様を読んでいます(私は同意しません)。プロジェクト設定にUNICODEが定義されていない場合はSがワイド文字列用に、UNICODEが定義されている場合はSはシングルバイト文字列用です。 %lsは、UNICODE用に構築しているかどうかにかかわらず、ワイド文字列用です。 %sも意味が異なりますが、%hsは常にシングルバイト文字列です。 –