9

Нулевые байты (ASCII 0x00) не отображаются для копирования (Ctrl+C-способный) в Windows. Для демонстрации этого откройте консоль разработчика вашего браузера и выполните console.log('a\x00b') . Если вы попытаетесь скопировать и вставить полученную строку на компьютере с Windows 8 (и, возможно, в других версиях Windows), вы обнаружите, что копируется только a . \x00 и все после него игнорируется.

Есть ли способ скопировать всю строку, которая содержит нулевые байты? Может ли буфер обмена содержать нулевые байты?

(Вспомогательный вопрос: почему нельзя скопировать нулевые байты? Например, есть ли причина, связанная с безопасностью, или это просто глупость Windows?)

1 ответ1

7

Нет, вы не можете поместить текст со встроенными нулевыми символами в буфер обмена. Давайте посмотрим на список стандартных форматов буфера обмена Windows. Есть несколько форматов, которые содержат вещи, обычно понимаемые как текст:

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

У каждого из них есть это предложение в своем определении:

Нулевой символ обозначает конец данных.

Теперь CF_UNICODETEXT сохраняет свои данные как UTF-16LE, так что он, скорее всего, будет иметь несколько нулевых байтов, но нулевые символы (в основном два нулевых байта в строке) по-прежнему заканчивают строку.

Мы можем только размышлять о том, почему нулевые символы не допускаются в тексте буфера обмена, но, скорее всего, это только потому, что наиболее часто используемые функции обработки строк в Windows предполагают, что нулевой символ сигнализирует о конце. Единственный другой способ узнать, где останавливается строка - это поставить перед ней префикс.

Вы можете хранить графику в буфере обмена, даже если они, вероятно, имеют нулевые байты, потому что они передаются в разных форматах буфера обмена (например, CF_BITMAP), которые программы должны понимать по-разному.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .