Нулевые байты (ASCII 0x00) не отображаются для копирования (Ctrl + C-способный) в Windows. Для демонстрации этого откройте консоль разработчика вашего браузера и сделайте console.log('a\x00b')
. Если вы попытаетесь скопировать и вставить полученную строку на компьютере с Windows 8 (и, возможно, в других версиях Windows), вы обнаружите, что a
копируются только файлы. И \x00
все после него игнорируется.
Есть ли способ скопировать всю строку, которая содержит нулевые байты? Может ли буфер обмена содержать нулевые байты?
(Вспомогательный вопрос: почему нельзя скопировать нулевые байты? Например, есть ли для этого причина, связанная с безопасностью, или это просто глупость Windows?)
windows
copy-paste
clipboard
senshin
источник
источник
C:\>echo 000000| xxd -r -p|xxd -p<ENTER> 000000 C:\>echo 000000| xxd -r -p|clip<ENTER> >
C:\>echo 000000| xxd -r -p|gclip<ENTER> C:\>pclip|xxd -p<ENTER> C:\>pclip>a.a<ENTER>
<- мне не ясно, входят ли нули в буфер обмена ... или они есть, но не вставляются.Ответы:
Нет, вы не можете поместить текст со встроенными нулевыми символами в буфер обмена. Давайте посмотрим на список стандартных форматов буфера обмена Windows . Есть несколько форматов, которые содержат вещи, обычно понимаемые как текст:
CF_TEXT
(1)CF_OEMTEXT
(7)CF_UNICODETEXT
(13)Каждый из них имеет это предложение в своем определении:
Теперь
CF_UNICODETEXT
хранит свои данные как UTF-16LE , поэтому он, скорее всего, будет иметь нулевые байты , но нулевые символы (в основном два нулевых байта в строке) по-прежнему будут заканчивать строку.Мы можем только догадываться о том, почему нулевые символы не допускаются в тексте буфера обмена, но, скорее всего, это происходит только потому, что наиболее часто используемые в Windows функции обработки строк предполагают, что нулевой символ сигнализирует о конце. Единственный другой способ узнать, где заканчивается строка - это поставить перед ней префикс.
Вы можете хранить графику в буфере обмена, даже если они, вероятно, имеют нулевые байты, потому что они передаются в разных форматах буфера обмена (например
CF_BITMAP
), которые программы должны понимать по-разному.источник