AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 449003
Accepted
Ole Tange
Ole Tange
Asked: 2018-06-11 13:36:08 +0800 CST2018-06-11 13:36:08 +0800 CST 2018-06-11 13:36:08 +0800 CST

Caracteres não-ascii não são mais exibidos no bash

  • 772

Atualizado: Este não é um problema do sistema de arquivos.

Eu costumava ser capaz de entrar:

$ echo kødpålæg

Mas agora bash/zsh mude isso para:

bash$ echo kddddddddplg
zsh$ echo k<c3><b8>dp<c3><a5>l<c3><a6>g

Eu posso executar cate inserir 'kødpålæg' sem problemas:

$ cat
kødpålæg
kødpålæg

Isso é tanto com este ambiente:

$ locale   
LANG=C
LANGUAGE=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

e neste:

$ locale 
LANG=da_DK.utf8
LANGUAGE=da_DK.utf8
LC_CTYPE="da_DK.utf8"
LC_NUMERIC="da_DK.utf8"
LC_TIME="da_DK.utf8"
LC_COLLATE="da_DK.utf8"
LC_MONETARY="da_DK.utf8"
LC_MESSAGES="da_DK.utf8"
LC_PAPER="da_DK.utf8"
LC_NAME="da_DK.utf8"
LC_ADDRESS="da_DK.utf8"
LC_TELEPHONE="da_DK.utf8"
LC_MEASUREMENT="da_DK.utf8"
LC_IDENTIFICATION="da_DK.utf8"
LC_ALL=da_DK.utf8

cshnão muda 'kødpålæg'.

Como posso recuperar o comportamento antigo, para que eu possa inserir 'kødpålæg'?

A execução de qualquer um deles fornece o comportamento antigo:

LC_ALL=en_GB.utf-8 luit
LC_ALL=da_DK.utf-8 luit
LC_ALL=en_GB.iso88591 luit
LC_ALL=da_DK.iso88591 luit

mas apenas para essa única sessão.

Este:

$ od -An -vtx1
ø

Dá:

 c3 b8 0a

Portanto, parece que a entrada do Konsole para o bash é UTF8.

$ konsole --version
QCoreApplication::arguments: Please instantiate the QApplication object first
Qt: 5.5.1
KDE Frameworks: 5.18.0
Konsole: 15.12.3

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ zsh --version
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

$ dpkg -l csh
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name              Version       Architecture  Description
+++-=================-=============-=============-========================================
ii  csh               20110502-2.1u amd64         Shell with C-like syntax
bash locale
  • 2 2 respostas
  • 1864 Views

2 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-06-12T00:29:33+08:002018-06-12T00:29:33+08:00

    Eu diria que provavelmente seu terminal está configurado incorretamente e envia e exibe caracteres em algum conjunto de caracteres de byte único, provavelmente ISO8859-1 ou ISO8859-15, dados os caracteres de amostra que você mostra em vez do conjunto de caracteres da localidade.

    Normalmente, não há caractere ø, å, æna localidade C e a codificação ISO8859-1(5) desses caracteres (0xf8, 0xe5, 0xe6) não forma caracteres válidos em UTF-8. Editores de linha como readline ou zle precisam decodificá-los em caracteres, pois precisam saber quantos bytes compõem uma coluna de exibição para que possam posicionar o cursor corretamente.

    Além disso, na localidade C que na maioria dos sistemas usa ASCII, já que não há nenhum caractere em ASCII com o 8º bit definido, esse 8º bit seria entendido bashcomo significando Meta. 0xF8 seria entendido como significando Meta+x(0x78 (x) | 0x80), porque é isso que alguns terminais enviam Alt+xou Meta+x.

    Enquanto Mx não está vinculado a nada por padrão em bash, ßseria entendido como M-_ e inseriria a última palavra. Você pode desativar isso com:

    bind 'set convert-meta off'
    

    Shells como cshsão muito antigos para saber que os caracteres podem ser feitos de vários bytes ou ocupar 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
    

    E insira esses caracteres seguidos por ^D^De veja qual codificação você vê. Se você vir 0xf8 para ø, isso significa que estou certo. Se você vir 0xc3 0xb8 em vez disso, que é a codificação UTF-8 ø, isso significa que estou errado.

    Ou altere a localidade para da_DK.iso88591(verifique locale -ao nome exato da localidade em seu sistema) e veja se isso funciona melhor.

    Agora, por que seu terminal pode enviar a codificação errada 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 por conjunto de caracteres ou codificação em sua configuração). Ou talvez você tenha sshentrado em outro sistema onde a localidade estava usando ISO8859-1(5) como seu conjunto de caracteres.

    Eu posso reproduzir esse comportamento se de um terminal UTF-8, eu executar:

    LC_ALL=en_GB.iso885915 luit
    

    E de dentro, luitaltere a localidade para Cou UTF-8 e insira caracteres não ASCII.

    • 4
  2. telcoM
    2018-06-12T00:07:58+08:002018-06-12T00:07:58+08:00

    Seu catteste indica que a conexão do terminal está limpa em 8 bits. Portanto, parece um possível problema de localidade.

    Execute locale -apara verificar se a localidade escolhida "da_DK.utf8" existe; se não estiver listado e você estiver em um sistema que pertence à família Debian/Ubuntu, talvez seja necessário descomentá-lo /etc/locale.gene executá- lo locale-gencomo root.

    Além disso, algumas versões do shell não podem alternar as localidades dinamicamente, mas continuam usando a configuração de localidade que foi originalmente herdada de seu processo pai . Se for esse o caso, a execução LC_CTYPE=da_DK.UTF-8 bashrestauraria o comportamento desejado, apenas para aquela sessão específica. Se isso for verdade, alterar a localidade padrão do sistema para qualquer localidade UTF-8 suportada e, em seguida, reinicializar pode ajudar: alteraria a localidade dos processos responsáveis ​​​​por manipular seu login e iniciar seu shell.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve