Parece que tudo se resume ao fato de que o charset em sua localidade é ASCII. ASCII é um charset americano dos anos 60 e é o denominador comum para a maioria dos conjuntos de caracteres modernos.
Isso geralmente acontece quando as localidades não estão configuradas (variáveis de ambiente LANG, LC_ * não são todas definidas) ou quando estão definidas como C
ou POSIX
.
Esse conjunto de caracteres define 128 caracteres com valores de byte de 0 a 127. Todos os caracteres que compõem a linguagem sh e são encontrados na maioria dos nomes de comandos estão em ASCII. Mas § e ° não são.
Agora esses símbolos estão no seu teclado, o que deve acontecer quando você digita em um emulador de terminal?
Se você iniciar seu emulador de terminal em um local onde o conjunto de caracteres é ASCII, você está dizendo ao emulador de terminal que quando você pressiona A , ( XK_a
X11 keypress event) ele precisa enviar a codificação do caractere a
na codificação ASCII, ou seja, 0x61. Mas quando você pressiona Shift + § ( XK_degree
X11 evento keypress), ele deve enviar a codificação para o caractere °, mas não existe tal caractere em ASCII, então o que deve fazer?
xterm
e rxvt
escolhem enviar a codificação de °
no conjunto de caracteres iso-8859-1. Esse é o conjunto de caracteres de 8 bits da maior parte do mundo ocidental (estende o ASCII para cobrir a maioria dos caracteres usados em idiomas como alemão, francês, inglês britânico, espanhol ...). Antes do UTF-8, esse era o conjunto de caracteres mais usado.
Meus konsole
, Eterm
e xfce4-terminal
enviam ?
para cada caractere não ASCII.
Meu gnome-terminal e terminator enviam a codificação UTF-8 de °
.
Quando bash
recebe a codificação iso8859-1 de °
(0xb0) como em xterm
, o que ela deve fazer?
Nós dissemos que o conjunto de caracteres era ASCII, de forma que 0xb0 corresponde a nenhum caractere conhecido.
Nos velhos tempos nos EUA, Ctrl + X era usado para inserir caracteres de 0 a 31 (os caracteres de controle). Em ASCII, isso enviaria os 5 bits inferiores do caractere correspondente. Por exemplo, A
sendo 0x41
, a
sendo 0x61
, Ctrl + A enviaria 0x61 & 0x1f, então 0x1 (o caractere ^A
, também conhecido como C-A). Enquanto Meta + X envia a codificação de x
com o conjunto de 8 bits. a
sendo 0x61
, Meta + A enviaria 0x61 | 0x80, isso é 0xe1. Pressionar Meta + 0 enviaria 0x30 | 0x80, isso é 0xb0 também conhecido como o caractere M-0 (não).
Em ASCII, 0x0 - > 0x1f são usados para caracteres de controle para os dias do teletypewriter, a maioria dos quais não são mais usados e 0x80 para 0xff não é usado, de modo que era uma maneira de inserir códigos que poderiam ser usados para fazer outras coisas que inserir texto. O emacs, por exemplo, usou aqueles para as teclas de edição, o caractere C-B
move o cursor um caractere para a esquerda, o caractere M-B
(não) move o cursor uma palavra para a esquerda.
Atualmente, como a maioria das pessoas usa conjuntos de caracteres que estendem o ASCII fazendo uso dos valores de byte 0x80 a 0xff, eles não são mais entendidos como os metacaracteres. Meta + X agora geralmente envia dois caracteres: os caracteres ESC e X.
Ainda assim, quando em uma localidade onde os valores de byte 0x80 a 0xff não podem ser caracteres, quando bash
(na verdade readline
) lê um valor de byte do dispositivo tty como 0xb0, ele entende como sendo M- 0 (que por padrão está vinculado a digit-argument
, o que explica seu arg: 0
).
Essa é a configuração convert-meta
na configuração readline. Você encontrará na documentação readline ( man 3 readline
) que quando readline detecta que o conjunto de caracteres é de 7 bits, ele define isso como on
para converter esses bytes 0xb0 em ESC + 0.
Se você desativar isso:
bind 'set convert-meta = off'
(e assumindo input-meta
e output-meta
também são on
). Então você verá que pressionar °
mostra a você °
exibido. Mas isso seria uma codificação iso8859-1 0xb0 de °
, cujos aplicativos não saberão o que fazer.
O que você precisa fazer é corrigir o código do idioma para um que tenha esses °
caracteres. Hoje em dia, você deve considerar apenas o UTF-8, que abrange todos os caracteres e é amplamente suportado.
Portanto, verifique sua configuração de desktop para sua configuração de internacionalização e escolha algo como de_CH.UTF-8
/ fr_CH.UTF-8
/ it_CH.UTF-8
(alemão / francês / italiano que fala suíço com UTF-8 como charset) que melhor corresponde ao seu ambiente.
Talvez você precise fazer logout e login novamente para que isso seja levado em consideração.
Alguns gerenciadores de login às vezes permitem que você selecione a localidade no momento do login por meio de um menu suspenso.