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 / 709189
Accepted
QuartzCristal
QuartzCristal
Asked: 2022-07-09 17:58:17 +0800 CST2022-07-09 17:58:17 +0800 CST 2022-07-09 17:58:17 +0800 CST

Para onde vão os personagens?

  • 772

Em um shell onde \ué válido (bash +4.3, ksh93 ou zsh), podemos imprimir caracteres Unicode:

$ printf 'a b c \ua0 \ua1 \ua2 \ua3 \n'
a b c   ¡ ¢ £

Que são alguns caracteres do intervalo Latin-1_Supplement .

No entanto, assim que um 9fcaractere Unicode é adicionado, a impressão é interrompida até que um Unicode 9cseja impresso.

Ambos \u9fe \u9c(APC e ST) são C1caracteres de controle .

$ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n'
a b c    ¡ ¢ £ 

Os personagens definitivamente desaparecem.

É certo que printfestá gerando todos os caracteres, e que redirecionando a saída para algum outro software (não o terminal) mostrará os caracteres gerados:

$ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n' | od -A n -tx1
 61 20 62 20 63 20 c2 9f 20 64 20 65 20 66 20 c2
 9c 20 c2 a0 20 c2 a1 20 c2 a2 20 c2 a3 20 0a

Isso chega a demonstrar que os personagens estão sendo gerados. Então, por que eles não estão sendo impressos (mostrado com algum glifo visível)?

As perguntas que tenho são:

  1. Está APCrealmente conectado a ST. Onde está definido?
  2. Os caracteres entre esses dois caracteres são enviados para algum aplicativo?
  3. Se sim, para qual aplicação?
  4. Quem é responsável por tal redirecionamento? O shell, o terminal ou algo mais?

EDITAR

Nem os terminais xtermnem removem os caracteres.konsoled e f

Isso confirma que é um problema interno do aplicativo do terminal, não do shell. Ainda não encontrei onde isso está definido.

bash shell
  • 3 3 respostas
  • 189 Views

3 respostas

  • Voted
  1. Best Answer
    telcoM
    2022-07-11T03:43:55+08:002022-07-11T03:43:55+08:00

    A APC está realmente conectada ao ST. Onde está definido?

    Esses caracteres de controle não são realmente originais do Unicode, mas herdados de especificações de conjuntos de caracteres mais antigos, como ECMA-48 , ISO/IEC 6429 e a família de codificações de caracteres ISO/IEC-8859. De um modo geral, esses padrões concordam essencialmente uns com os outros nos caracteres de controle C1 (porque eles estão sendo compatíveis com versões anteriores entre si e algumas especificações ainda mais antigas).

    Como as cópias da ISO/IEC 6429 estão sendo vendidas, não espero encontrar uma cópia legítima disponível gratuitamente na internet, mas a ECMA-48 diz:

    8.3.2 APC - COMANDO DO PROGRAMA DE APLICAÇÃO

    Notação: (C1)

    Representação: 15/09 ou ESC 15/05

    APC é usado como delimitador de abertura de uma string de controle para uso do programa aplicativo. A sequência de comandos a seguir pode consistir em combinações de bits no intervalo de 08/00 a 13/00 e 00/02 a 14/07. A cadeia de controle é fechada pelo delimitador de terminação STRING TERMINATOR (ST). A interpretação da sequência de comandos depende do programa de aplicação relevante.

    e:

    8.3.143 ST - TERMINADOR DE CORDA

    Notação: (C1)

    Representação: 09/12 ou ESC 05/12

    ST é usado como delimitador de fechamento de uma string de controle aberta por APPLICATION PROGRAM COMMAND (APC), DEVICE CONTROL STRING (DCS), OPERATING SYSTEM COMMAND (OSC), PRIVACY MESSAGE (PM) ou START OF STRING (SOS).

    Unicode define apenas um caractere de controle dentro do intervalo de caracteres de controle C1: U+0085 Next Line (NEL). Para quaisquer outros caracteres dentro do intervalo C1, esta parte da especificação se aplica:

    A semântica dos códigos de controle é geralmente determinada pela aplicação com a qual eles são usados. No entanto, na ausência de usos específicos da aplicação, eles podem ser interpretados de acordo com a semântica da função de controle especificada na ISO/IEC 6429:1992.

    Não posso verificá-lo aqui, mas espero que o ISO/IEC 6429 esteja em conformidade com o que o ECMA-48 disse, como acima. Além disso, o autor do terminal pode ter considerado "ser compatível com versões anteriores com codificações de caracteres pré-Unicode de 7 bits e 8 bits, como ECMA-48" para ser um uso específico do aplicativo .

    Portanto, o terminal pode interpretar legitimamente os caracteres entre APC e ST como "Não sei para que servem, mas com certeza sei que não devem ser exibidos como saída regular".

    O terminal pode ou não estar programado para reagir de alguma forma a algumas strings específicas encapsuladas entre APC e ST e ignorar quaisquer strings não correspondentes. Uma vez que a janela do terminal é o "último passo antes do humano", certamente seria capaz de assumir que qualquer string de comando do programa aplicativo que chega a ela é destinada ao terminal para interpretar e agir, se aplicável, e quaisquer strings irreconhecíveis pelo terminal deve ser erros.

    Exibir um caractere de "codificação inválida" ou outra mensagem de erro não seria apropriado, pois a string é codificada de forma válida como "string de controle específica do aplicativo, não para exibição ". Então, a resposta para a pergunta do título "para onde estão indo os personagens?" é mais provável: eles estão sendo descartados como parte de uma string de controle inválida .

    Mas observe que a especificação Unicode dizia "... pode ser interpretado...", não "... deve ser interpretado...". Portanto, a escolha das outras implementações de terminal de simplesmente ignorar os caracteres APC e ST como caracteres de controle não imprimíveis sem significado aplicável também não é necessariamente inválida.

    Esta questão no Stack Overflow também discute as sequências de controle envolvendo os caracteres de controle APC e ST.

    A resposta aceita lá diz:

    A realidade é que o APC raramente é implementado – a maioria dos sistemas nunca gera sequências APC e ignora silenciosamente qualquer sequência recebida. Nenhum aplicativo deve enviar ou interpretar sequências APC a menos que saiba que a outra extremidade da conexão está usando-as de uma maneira específica - como por meio de uma opção de configuração para habilitar seu uso, ou se (de alguma forma) souber qual emulador de terminal está sendo usado e sabe que o emulador de terminal lhes atribui um significado particular [...]

    • 4
  2. terdon
    2022-07-11T02:52:36+08:002022-07-11T02:52:36+08:00

    Os caracteres não estão sendo enviados para nenhum lugar, eles simplesmente não estão sendo exibidos pelo seu terminal apesar de estarem lá na saída:

    $ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n' | od -c
    0000000   a       b       c     302 237       d       e       f     302
    0000020 234     302 240     302 241     302 242     302 243      \n
    0000037
    

    Você também pode confirmar que eles estão na saída redirecionando para um arquivo e investigando o arquivo:

    $ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n' > file
    $ od -c file
    0000000   a       b       c     302 237       d       e       f     302
    0000020 234     302 240     302 241     302 242     302 243      \n
    0000037
    

    Parece que o que um terminal faz com a combinação de \u9fe \u9cdepende da implementação. Simplesmente acontece que a maneira como seu terminal lida com isso é voltando alguns caracteres e continuando a impressão a partir daí, o que resulta na substituição de outros caracteres. É por isso que você vê:

    $ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n'
    a b c    ¡ ¢ £ 
    

    Eu posso reproduzir isso em gnome-terminator, mas xtermapenas imprime um espaço:

    $ printf 'a b c \u9f d e f \u9c \ua0 \ua1 \ua2 \ua3 \n'
    a b c  d e f    ¡ ¢ £ 
    

    Aqui está a mesma coisa nas capturas de tela:

    captura de tela mostrando saída diferente no xterm e no gnome-terminal

    Isso é semelhante ao que acontece em um caso mais claro, o de usar um retorno de carro ( \r) cuja função é justamente voltar ao início de uma linha. É por isso que você obtém:

    $ printf '12345\r67890\n'
    67890
    

    O terminal começou a imprimir 12345, então o \renviou de volta para o início da linha onde substituiu o 12345com o 67890então o que você acaba vendo é apenas 67890. Mas o 132345não foi enviado para nenhum outro programa, ainda está lá, simplesmente não é visível porque os outros caracteres o sobrescreveram:

    $ printf '12345\r67890\n' | od -c
    0000000   1   2   3   4   5  \r   6   7   8   9   0  \n
    0000014
    
    • 1
  3. Sotto Voce
    2022-07-10T04:29:28+08:002022-07-10T04:29:28+08:00

    Você está explicando comandos que produzem sequências de caracteres UTF8 e os resultados que você vê exibidos na janela do seu emulador de terminal (geralmente chamado de "minha janela de terminal").

    Em seguida, você descreve sequências de caracteres que parecem não causar resultados visíveis na janela do emulador de terminal. E você pergunta: "os personagens estão sendo enviados para algum aplicativo?"

    Sim, eles estão sendo entregues ao seu emulador de terminal, que interpreta as sequências de caracteres que recebe e decide quais glifos exibirá em sua janela para você visualizar.

    • -1

relate perguntas

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

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

  • Como salvar um caminho com ~ em uma variável?

  • 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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

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

    • 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

    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
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • 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
    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

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