Eu tenho uma lista de pontos de código Unicode, mas não conheço uma maneira "simples" de converter esses valores hexadecimais nos caracteres reais que eles representam ...
Ouvi dizer que o zsh tem echo -e '\u0965'
, mas uso o bash 4.1.
Existe algo tão simples quanto o método zsh, para o bash?
Respostas:
Você pode usar o eco do bash ou / bin / echo do GNU coreutils em combinação com iconv:
Por padrão, o iconv converte em sua codificação de localidades. Talvez mais portátil do que confiar em um shell ou comando de eco específico seja o Perl. A maioria dos sistemas UNIX que conheço possui o Perl disponível e ele ainda possui várias portas do Windows.
Na maioria das vezes, quando preciso fazer isso, estou em um editor como o Vim / GVim, que possui suporte embutido. Enquanto estiver no modo de inserção, pressione Ctrl-V seguido de u e digite quatro caracteres hexadecimais. Se você deseja um caractere além de U + FFFF, use um U maiúsculo e digite 8 caracteres hexadecimais. O Vim também suporta mapas personalizados fáceis de criar. Ele converte uma série de caracteres em outro símbolo. Por exemplo, eu tenho um mapa-chave que desenvolvi chamado www, converte TM para ™, (C) para ©, (R) para ® e assim por diante. Eu também tenho um mapa-chave para o Klingon para quando isso se tornar necessário. Tenho certeza que o Emacs tem algo parecido. Se você estiver em um aplicativo GTK + que inclui o GVim e o Terminal GNOME, tente Control-Shift-u seguido de 4 caracteres hexadecimais para criar um caractere Unicode. Tenho certeza que o KDE / Qt tem algo parecido.
ATUALIZAÇÃO: A partir do Bash 4.2, parece ser um recurso incorporado agora:
ATUALIZAÇÃO: Além disso, hoje em dia um exemplo em Python provavelmente seria preferido em relação ao Perl. Isso funciona no Python 2 e 3:
fonte
chr 0xa2
em um local UTF-8, recebo um sinal de centavos ¢, mas se eu usar LANG = C, recebo porque imprime o byte 0xa2 que é inválido no UTF-8. O exemplo Vim / GVim é semi-sensível ao código do idioma. Mais corretamente, para a codificação do arquivo. Se você começou Vim em um local não-UTF-8, você precisará:set encoding=utf-8
chr 0x12000
no Perl (assumindo que o Unicode está ativo) para representá-lo. No UTF-16BE, são 0xd8, 0x08, 0xdc e 0x00. Seu personagem é U + 0965, que são os bytes 0x09 seguidos por 0x65 em UTF-16BE.perl
resposta agora é a melhor (para meus requisitos particulares) .. Eu já havia descartado a impressão (meses atrás) , mas eu tinha esquecido. Aqui está a pergunta / resposta sobre seus limites ... Por que printf relata um erro em todos, exceto em três (Unicode-range ASCII) Unicode CodepointsBash 4.2 (lançado em 2011) adicionado suporte para
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
eecho $'\u0965'
também de trabalho.http://tiswww.case.edu/php/chet/bash/FAQ :
fonte
bash 4.2.x
versões possuem um erro em que os valores entre0x80
e0xff
(128 - 255
) - ou seja, no intervalo ASCII estendido - NÃO são codificados corretamente em UTF8 e, em vez disso, passam apenas, resultando em um caractere UTF8 inválido que alguns terminais processam?
. A partir de (pelo menos)4.3.11
isso foi corrigido; seecho $'\ued'
processadoí
, o bug não está presente.Se você possui GNU coreutils, tente
printf
:echo
Você pode executar o trabalho se o console estiver usando UTF-8 e você tiver a codificação UTF-8:Você pode encontrar uma tabela de codificações hexadecimais Unicode para UTF-8 aqui: http://www.utf8-chartable.de/ . Você pode converter os pontos de código Unicode em hexadecimal usando várias linguagens de script. Aqui está um exemplo usando python:
A seguir, um script Perl que converterá argumentos para o valor hexadecimal correto (muitos parênteses desnecessários aqui):
Por exemplo,
Obviamente, se você possui Perl ou Python, também pode usá-los para imprimir os caracteres.
fonte
echo
não fará o que eu quero, pois os Codepoints são Big-Endian UTF-16 de 2 bytes .. mas você me lembrou que existem 2 funções printf! (Eu pensei que o printf poderia fazer isso, e parece que eu estava invocando o errado) ...$(which printf)
funciona ... Obrigado pelo exemplo do python ... mas por isso (minha curva de aprendizado), estou tentando ficar o mais próximo possível possível "bash" como a única linguagem de escrita envolvida .. (quando estiver confortável o suficiente com bash, ficarei preso no Python ... btw,.encode('hex')
está um passo além do que eu preciso .. (achei que parecia um pouco ocupado em lá :)printf
exposto acima, mas ele não manipula valores abaixo da... I've just re-discovered something I already knew (but dropped off the radar)... Here is a Question I asked about 4 months ago; [Why does printf report an error on all but three (ASCII-range) Unicode Codepoints](http://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoints)... So *penguin359's*
solução `` \ u00A0 perl` está muito boa agora :) .. É uma invocação única e depois de "fácil digitar", então darei ele o green-tick paraperl
UPDATE: Aqui está uma maneira básica de fazer um único valor Unicode ... (por "bash" quero dizer: não usar nenhuma outra linguagem de script) .. obrigado a Gilles por uma sugestão neste Q / A do askubuntu .
De acordo com este link : recode (Obsoletes iconv, dos2unix, unix2dos) .. Edit: mas conforme o comentário abaixo, "obsoletos" pode significar apenas "alternativa"
Aqui está um método para processar um dump hexadecimal bruto como entrada (por exemplo, sem prefixos de escape como \ u0965 e no \ x09 \ x65) ..
xxd
é um utilitário dump hexadecimal (fornecido comvim-common
) que pode reverter um dump hexadecimal bruto para os caracteres que o dump representa ... Os pontos de código Unicode são UTF-16BigEndian, que é exatamente o que é um dump hexadecimal.xxd
No modo de reversão, aceita um fluxo de valores hexadecimais com quebras de linha. que são ignorados.Esse script cria um fluxo UTF-16BE, que depois reverte para os caracteres originais.
A última linha contém os dois comandos necessários;
xxd
eiconv
Aqui está a saída (mostrando a entrada hexadecimal UTF-16BE, primeiro).
Nota;
xxd
segmenta sua própria saída com uma nova linha em 60 dígitos hexadecimais ... A opção de reversão ignora essas novas linhas .. ignora todas / todas as novas linhas (como os dígitos hexadecimais).fonte
bash
método rápido e simples . Por "bash", quero dizer: usando a linguagem de script bash; não python / perl de dentro do bash). Adicionei isso como resposta, pois pode ter algum valor para alguém que está lendo esta página. É uma linha única para um arquivo inteiro. Vocêprintf
é a melhor resposta para mim.Supondo que a codificação padrão para o seu sistema operacional seja UTF-8 (verdadeira para a maioria das distribuições atuais), você pode usar o bash diretamente para converter qualquer ponto de código UNICODE:
Obviamente, o glifo aparecerá corretamente apenas se você tiver a fonte correta. A partir do bash 4.3, todos os pontos de código funcionarão corretamente. E essas duas opções internas também funcionarão:
Observe que, para o bash 4.2, os pontos de código Unicode de
0x80
para0xFF
são codificados incorretamente (bug do bash). Para solucionar esse problema, você deve dar uma olhada no programa neste site (também é bom para uma análise aprofundada da questão da conversão de números em caracteres.fonte
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Descrição: \ U e \ U incorretamente valores codificar entre \ U80 e \ uffUsando a substituição Pattern na versão 4.2 do bash (e superior):
conforme descrito aqui http://steve-parker.org/sh/tips/pattern-substitution/
fonte