Bytes nulos (ASCII 0x00) não parecem ser copiáveis (compatíveis com Ctrl + C) no Windows. Para uma demonstração disso, abra o console de desenvolvimento do seu navegador e faça console.log('a\x00b')
. Se você tentar copiar e colar a sequência resultante em uma máquina Windows 8 (e provavelmente outras versões do Windows também), verá que apenas as a
cópias são copiadas. O \x00
e tudo depois que é ignorado.
Existe alguma maneira de copiar a totalidade de uma string que contém bytes nulos? A área de transferência pode conter bytes nulos?
(Pergunta auxiliar: por que os bytes nulos não podem ser copiados? Por exemplo, existe um motivo relacionado à segurança para isso ou apenas o Windows é bobo?)
windows
copy-paste
clipboard
senshin
fonte
fonte
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>
<- não está claro para mim se os nulos estão entrando na área de transferência .. ou se estão dentro, mas não estão colando.Respostas:
Não, você não pode colocar texto com caracteres nulos incorporados na área de transferência. Vejamos a lista de formatos padrão da área de transferência do Windows . Existem alguns formatos que mantêm coisas geralmente entendidas como texto:
CF_TEXT
(1)CF_OEMTEXT
(7)CF_UNICODETEXT
(13)Cada um deles tem esta frase em sua definição:
Agora,
CF_UNICODETEXT
mantém seus dados como UTF-16LE , portanto, mais do que provavelmente terá alguns bytes nulos , mas caracteres nulos (dois bytes nulos seguidos, basicamente) ainda terminarão a sequência.Podemos apenas especular sobre por que caracteres nulos não são permitidos no texto da área de transferência, mas é mais provável que seja apenas porque as funções de processamento de string mais usadas no Windows assumem que um caractere nulo sinaliza o fim. A única outra maneira de saber onde uma string pára seria prefixá-la com seu comprimento.
Você pode reter gráficos na área de transferência, mesmo que eles provavelmente tenham bytes nulos, porque são distribuídos em diferentes formatos da área de transferência (por exemplo
CF_BITMAP
), que precisam ser entendidos de forma diferente pelos programas.fonte