Tengo una lista de puntos de código Unicode, pero no conozco una forma "simple" de convertir estos valores hexadecimales en los caracteres reales que representan ...
He oído que zsh tiene echo -e '\u0965'
, pero yo uso Bash 4.1.
¿Hay algo tan simple como el método zsh, para bash?
Respuestas:
Puede usar echo de bash o / bin / echo de GNU coreutils en combinación con iconv:
Por defecto, iconv se convierte a su codificación local. Quizás más portátil que confiar en un shell específico o comando echo es Perl. La mayoría de los sistemas UNIX que conozco tienen Perl disponible e incluso tienen varios puertos de Windows.
La mayoría de las veces cuando necesito hacer esto, estoy en un editor como Vim / GVim que tiene soporte incorporado. Mientras está en modo de inserción, presione Ctrl-V seguido de u, luego escriba cuatro caracteres hexadecimales. Si quieres un personaje más allá de U + FFFF, usa una U mayúscula y escribe 8 caracteres hexadecimales. Vim también admite mapas de teclas personalizados fáciles de hacer. Convierte una serie de caracteres en otro símbolo. Por ejemplo, tengo un mapa de teclas que desarrollé llamado www, convierte TM a ™, (C) a ©, (R) a ®, y así sucesivamente. También tengo un mapa de teclas para Klingon para cuando sea necesario. Estoy seguro de que Emacs tiene algo similar. Si está en una aplicación GTK + que incluye GVim y GNOME Terminal, puede probar Control-Shift-u seguido de 4 caracteres hexadecimales para crear un personaje Unicode. Estoy seguro de que KDE / Qt tiene algo similar.
ACTUALIZACIÓN: A partir de Bash 4.2, parece ser una característica incorporada ahora:
ACTUALIZACIÓN: Además, hoy en día un ejemplo de Python probablemente sería preferible a Perl. Esto funciona en Python 2 y 3:
fuente
chr 0xa2
en un entorno local UTF-8 obtengo un signo de centavos ¢, pero si uso LANG = C, obtengo porque imprime el byte 0xa2 que no es válido en UTF-8. El ejemplo de Vim / GVim es semi-sensible a la configuración regional. Más correctamente, a la codificación del archivo. Si inició Vim en un entorno local que no sea UTF-8, deberá hacerlo:set encoding=utf-8
chr 0x12000
en Perl (suponiendo que Unicode esté activo) para representarlo. En UTF-16BE, esto es 0xd8, 0x08, 0xdc y 0x00. Tu personaje es U + 0965, que son los bytes 0x09 seguidos de 0x65 en UTF-16BE.perl
respuesta ahora es la mejor (para mis requisitos particulares). Anteriormente descarté printf (hace meses) , pero me había olvidado de eso. Aquí está la pregunta / respuesta sobre sus límites ... ¿Por qué printf informa un error en todos menos tres puntos de código Unicode (rango ASCII)Bash 4.2 (lanzado en 2011) añadido soporte para
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
yecho $'\u0965'
también trabajo.http://tiswww.case.edu/php/chet/bash/FAQ :
fuente
bash 4.2.x
versiones tienen un error en el que los valores entre0x80
y0xff
(128 - 255
), es decir, en el rango ASCII extendido, NO están correctamente codificados en UTF8 y en su lugar simplemente se pasan, lo que da como resultado un carácter UTF8 no válido que algunos terminales representan?
. A partir de (al menos)4.3.11
esto se ha solucionado; si seecho $'\ued'
procesaí
, entonces el error no está presente.Si tienes GNU coreutils, prueba
printf
:echo
puede hacer el trabajo si su consola está usando UTF-8 y tiene la codificación UTF-8:Puede encontrar una tabla de codificaciones hexadecimales Unicode a UTF-8 aquí: http://www.utf8-chartable.de/ . Puede convertir los puntos de código Unicode a hexadecimal utilizando varios lenguajes de secuencias de comandos. Aquí hay un ejemplo usando Python:
El siguiente es un script de Perl que convertirá los argumentos al valor hexadecimal correcto (muchos paréntesis innecesarios aquí):
Por ejemplo,
Por supuesto, si tiene Perl o Python, también podría usarlos para imprimir los caracteres.
fuente
echo
No harán lo que quiero, ya que los Codepoints son Big-Endian UTF-16 de 2 bytes ... ¡pero me han recordado que hay 2 funciones printf! (Pensé que printf podría hacerlo, y parece que estaba invocando el incorrecto) ...$(which printf)
funciona ... Gracias por el ejemplo de Python ... pero por esto (mi curva de aprendizaje), estoy tratando de mantenerme lo más cerca posible como sea posible "bash" como el único lenguaje de escrutinio involucrado ... (cuando me sienta lo suficientemente cómodo con bash, me quedaré atrapado en Python ... por cierto,.encode('hex')
está un paso más allá de lo que necesito ... (pensé que parecía un poco ocupado allí :)printf
anterior, pero no maneja los valores por debajo de `` \ u00A0... 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*
perl` la solución se ve bastante bien ahora :) .. Es una invocación única, y yo después de "fácil de escribir", así que daré él el verde-tick paraperl
ACTUALIZACIÓN: Aquí hay una manera bash de hacer un único valor Unicode ... (por "bash" quiero decir: no usar ningún otro lenguaje de secuencias de comandos) ... gracias a Gilles por su sugerencia en este Q / A de askubuntu .
De acuerdo con este enlace : recode (Obsoletes iconv, dos2unix, unix2dos) .. Editar: pero según el comentario a continuación, "obsoletos" puede significar "alternativa"
Aquí hay un método para procesar un volcado hexadecimal sin procesar como entrada (es decir, sin prefijos con escape como; \ u0965 y no \ x09 \ x65) ...
xxd
es una utilidad de volcado hexadecimal (empaquetado convim-common
) que puede revertir un volcado hexadecimal sin procesar para los caracteres que representa el volcado ... Los puntos de código Unicode son UTF-16BigEndian, que es exactamente lo que es un volcado hexadecimal ...xxd
en modo reversible acepta una secuencia de valores hexadecimales con saltos de línea que se ignoran.Este script crea una secuencia UTF-16BE, que luego vuelve a los caracteres originales.
La última línea contiene los dos comandos necesarios;
xxd
yiconv
Aquí está la salida (que muestra la entrada de volcado hexadecimal UTF-16BE, primero).
Nota;
xxd
segmenta su propia salida con una nueva línea en 60 dígitos hexadecimales ... La opción de reversión ignora estas nuevas líneas ... ignora cualquiera / todas las nuevas líneas (ya que no son dígitos hexadecimales) ...fuente
bash
método rápido y simple . Por "bash" quiero decir: usar el lenguaje de script bash; no python / perl desde dentro de bash). He agregado esto como respuesta porque puede ser de algún valor para alguien que lea esta página. Es una buena frase para un archivo completo. Tuprintf
es la mejor respuesta para mí.Suponiendo que la codificación predeterminada para su sistema operativo es UTF-8 (cierto para la mayoría de las distribuciones actuales), puede usar bash directamente para convertir cualquier punto de código UNICODE:
Por supuesto, el glifo aparecerá correctamente solo si tiene la fuente correcta. A partir de bash 4.3, todos los puntos de código funcionarán correctamente. Y estas dos opciones integradas también funcionarán:
Tenga en cuenta que para bash 4.2, los puntos de código Unicode de
0x80
a0xFF
están codificados incorrectamente (error de bash). Para solucionar este problema, debe echar un vistazo al programa en este sitio (también es bueno para profundizar en el tema de la conversión de números a caracteres).fuente
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Descripción: \ uy \ U codifican incorrectamente valores entre \ u80 y \ uffUsando la sustitución de patrones en bash versión 4.2 (y superior):
como se describe aquí http://steve-parker.org/sh/tips/pattern-substitution/
fuente