Un amigo pegó un comando en una sala de chat Slack que contenía al personaje *
. Esto parece normal *
pero no lo es:
$ uniprops '*'
uniprops: no character named ‹*›
Mientras que si ejecuto uniprops
el asterisco que obtengo al escribir en mi máquina, obtengo:
$ uniprops '*'
U+002A ‹*› \N{ASTERISK}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
X_POSIX_Print Punctuation Unicode X_POSIX_Punct
También puedo ver que no es un asterisco real al pasarlo od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Mientras que el normal da:
$ printf '*' | od -c
0000000 *
0000001
Aquí está el personaje misterioso un poco más grande:
* *
Y el asterisco normal (sí, se ven idénticos):
* *
Entonces, uniprops
no sabe qué es esto, y tampoco puedo encontrarlo en http://www.fileformat.info/ . Sé que el amigo que lo pegó está en OS X (estoy en Linux) y que funciona en su sistema como un asterisco normal. Supongo que Slack de alguna manera lo cambió. Entonces, ¿alguien tiene alguna idea de cuál es ese personaje?
Tenga en cuenta que no puede copiar el personaje extraño directamente de la pregunta. Aparentemente, el motor de Stack Exchange elimina los caracteres finales que no se imprimen. Haga clic en el enlace "editar" y copie desde allí en su lugar.
uniprops
es un pequeño script ordenado incluido en el Unicode::Tussle
módulo Perl que identifica e imprime información sobre el personaje que le das.
fuente
ord("*")
su cadena pegada y la*
clave nativa , y obtuve el mismo número para ambos (42).urxvt
, ya se muestra como*<200b>
.'*\u200b'
)Respuestas:
La pasta falló no por el asterisco, que es un asterisco perfectamente regular, sino por el carácter Unicode U + 200B . Como el carácter es un
ZERO WIDTH SPACE
, no se muestra cuando se copia.Usando el código Python:
La función
uniconv
convierte la cadena de entrada (en este casou"'*'?"
) en sus equivalentes de página de códigos Unicode en formato hexadecimal. Elu
prefijo de la cadena identifica la cadena como una cadena Unicode.Pude obtener la salida:
Podemos ver claramente eso
0x27
,0x2a
y0x3f
son los valores hexadecimales ASCII / Unicode para los caracteres'
,*
y?
respectivamente. Eso deja0x200b
, por lo tanto, la identificación del personaje.Tenga en cuenta que el código Python, cuando se pega en el cuerpo, tenía el carácter U + 200B eliminado por el software Markdown de SE. Para obtener el resultado esperado, debe copiarlo directamente desde el título utilizando la vista Editar.
fuente
str
conhex
generará los puntos de código en hexadecimal, haciéndolos más fáciles de reconocer o buscar.unicodedata
, con el que puede consultar los nombres de los personajes, la categoría, etc.Con la ayuda de @Rinzwind en la sala de chat Ask Ubuntu, descubrí que el problema no es el personaje en absoluto. Tenga en cuenta la salida de
od
:El
342 200 213
es una representación octal de otro personaje y podemos usar este sitio para buscarlo:Entonces, lo que realmente tenía eran dos caracteres unicode, el
*
espacio normal y un espacio de ancho cero.fuente
printf '\342\200\213' | uniname
. (Uniname es del paquete Uniutils)002A 200B
, para utf-82A E2 80 8B
para utf-16002A 200B
...