Aqui está o meu problema simples: como posso converter meia largura em largura total na linha de comando. Achei que isso estaria embutido na minha iconv
linha de comando, mas não encontrei nada aqui:
$ iconv -l | grep -i full
-> nothing
$ iconv -l | grep -i half
-> nothing
A entrada típica seria:
$ echo -n "Ab9876543210" | iconv -f utf8 -t utf16be | hexdump -C
00000000 ff 21 00 62 ff 19 ff 18 ff 17 ff 16 ff 15 ff 14 |.!.b............|
00000010 ff 13 ff 12 ff 11 ff 10 |........|
00000018
Se você tiver o
uconv
utilitário das ferramentas ICU (icu-devtools
pacote em sistemas operacionais baseados em Debian):(cuidado, ele também converte caracteres que normalmente têm largura total, como os dos scripts coreano ou japonês, em sua representação de meia largura).
Mude para
Halfwidth-Fullwidth
para o inverso.Caso contrário, e você estiver interessado apenas em converter as variantes de largura total dos caracteres imprimíveis ASCII:
Ou também convertendo U+3000 (espaço ideográfico) para espaço ASCII:
Irá revelar alguns extras que são variantes de largura total de alguns caracteres não ASCII, que você pode adicionar à lista.
(e a pesquisa
<narrow>
mostrará as variantes de meia largura de alguns caracteres normalmente de largura total, mas é uma lista grande e com intervalos não contíguos, portanto, adicioná-los tornaria a expressão muito maior).Em alguns sistemas, você pode fazer o mesmo
tr
se estiver no código do idioma C.UTF-8, não com as versões atuais do GNUtr
, a menos que seja corrigido pelo fornecedor do seu sistema operacional .(também assumindo um shell com suporte para zsh's
$'\uXXXX'
).Para a conversão reversa, basta alterar
y/from/to/
paray/to/from/
.perl
também possui uma interface para os dados Unicode em seuUnicode::UCD
módulo, então você também pode fazer:Embora seja bastante lento, mesmo que seja mitigado aqui pelo uso de cache. Veja
perldoc perluniprops
eperldoc Unicode::UCD
para detalhes.Ou usando a decomposição NFKD para os caracteres que possuem um tipo de decomposição amplo :
Se for para converter para ASCII, pelo menos em sistemas GNU,
iconv -t ASCII//translit
também converteria esses (e mais caracteres para sua representação de caractere ASCII mais próxima¹)Obviamente, não há como fazer o inverso.
De qualquer forma, aqui, não é a conversão do mesmo caractere de charset para charset que você deseja fazer, mas alguma forma de transliteração de alguns caracteres para outros caracteres.
iconv -l
likeuconv -l
lista as codificações/conjuntos de caracteres suportados.uconv -L
lista os transliteradores. GNUiconv
só tem aquilo//translit
que dá uma aproximação possível se o caractere não existir no conjunto de caracteres de destino (além//ignore
de apenas descartá-los).¹ ou caracteres como em
æ
->ae
ouffi
->ffi
que, a propósito, não possuem formatos de largura total, mas já foram aproximados; por exemplo, você pode querer converteraffix
paraaffix
em vez deaffix
converter para largura total, o que nenhuma das soluções mencionadas aqui trata.