Eu diria que seu terminal está mal configurado e envia e exibe caracteres em algum conjunto de caracteres de byte único, provavelmente ISO8859-1 ou ISO8859-15, dados os caracteres de amostra mostrados em vez do conjunto de caracteres do locale.
Geralmente, não há caracteres ø
, å
, æ
na localidade C e a codificação ISO8859-1 (5) desses caracteres (0xf8, 0xe5, 0xe6) não formam caracteres válidos em UTF -8. Editores de linha como readline ou zle precisam decodificá-los em caracteres, pois precisam saber quantos bytes formam uma coluna de exibição para que possam posicionar corretamente o cursor.
Além disso, no local C, que na maioria dos sistemas usa ASCII, já que não há caracteres em ASCII com o conjunto de bits 8 th , esse bit 8 th seria entendido por bash
como significando Meta . 0xF8 seria entendido como significando Meta + x (0x78 (x) | 0x80), porque é isso que alguns terminais enviam em Alt + x ou Meta + x .
Enquanto M-x não está vinculado a nada por padrão em bash
, ß
seria entendido como M-_ e inserir a última palavra. Você pode desativar isso com:
bind 'set convert-meta off'
Shells como csh
são antigos demais para estarem cientes de que os caracteres podem ser feitos de vários bytes ou ocupam qualquer coisa além de uma única largura de coluna, então eles não se incomodam.
Para verificar essa teoria, execute:
od -An -vtx1
Digite esses caracteres seguidos por ^D^D
e veja qual codificação você vê. Se você ver 0xf8 para ø
, isso significa que estou certo. Se você vir 0xc3 0xb8, que é a codificação UTF-8 de ø
, isso significa que estou errado.
Ou altere a localidade para da_DK.iso88591
(verifique em locale -a
o nome exato da localidade em seu sistema) e veja se isso funciona melhor.
Agora, por que seu terminal pode enviar a codificação incorreta para esses caracteres, talvez tenha sido iniciado em uma localidade onde o conjunto de caracteres era iso8859-1. Talvez esteja configurado para ignorar a localidade e usar um conjunto de caracteres específico (procure charset ou codificação em sua configuração). Ou talvez você tenha ssh
ed de outro sistema onde o local estava usando ISO8859-1 (5) como charset.
Eu posso reproduzir esse comportamento se de um terminal UTF-8, eu corro:
LC_ALL=en_GB.iso885915 luit
E de luit
altere a localidade para C
ou uma UTF-8 e insira caracteres não-ASCII.