web-dev-qa-db-ja.com

Windowsでnullバイト(ASCII 0x00)をクリップボードにコピーする方法はありますか?

Nullバイト(ASCII 0x00)は、Windowsではコピー可能(Ctrl + C対応)に表示されません。このデモを行うには、ブラウザの開発コンソールを開いてconsole.log('a\x00b')を実行します。結果の文字列をWindows 8マシン(およびおそらく他のバージョンのWindows)にコピーアンドペーストしようとすると、aのみがコピーされることがわかります。 \x00およびそれ以降はすべて無視されます。

Nullバイトを含む文字列全体をコピーする方法はありますか?クリップボードはnullバイトも保持できますか?

(補助的な質問:理由 nullバイトをコピーできない?たとえば、これにセキュリティ関連の理由があるのか​​、それともWindowsが愚かであるのか?)

14
senshin

いいえ、ヌル文字が埋め込まれたテキストをクリップボードに置くことはできません。 標準のWindowsクリップボード形式のリスト を見てみましょう。一般にテキストとして理解されるものを保持するいくつかの形式があります。

  • CF_TEXT(1)
  • CF_OEMTEXT (7)
  • CF_UNICODETEXT(13)

それらのどれもその定義にこの文があります:

NULL文字はデータの終わりを示します。

さて、CF_UNICODETEXTデータをUTF-16LEとして保持する なので、nullbytesがnull文字(行の2つのnullバイトは、基本的に)文字列を終了します。

クリップボードテキストでnull文字が許可されない理由について推測することしかできませんが、Windowsで最も一般的に使用されている文字列処理関数がnull文字で終了を通知すると想定しているためと考えられます。文字列がどこで停止するかを知る唯一の他の方法は、文字列にその長さを前に付けることです。

グラフィックは異なるクリップボード形式で渡されるため、nullバイトが含まれている可能性がありますが、クリップボードにグラフィックを保持できます(例:CF_BITMAP)、これはプログラムによって異なって理解される必要があります。

10
Ben N