No confíe en las expresiones regulares: JSON tiene algunos casos de esquina extraños con \u
escapes y puntos de código que no son BMP. (específicamente, JSON codificará un punto de código usando dos\u
escapes) Si supone que 1 secuencia de escape se traduce en 1 punto de código, está condenado a dicho texto.
El uso de un analizador completo JSON desde el idioma de su elección es considerablemente más robusto:
$ echo '["foo bar \u0144\n"]' | python -c 'import json, sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'
Eso es realmente sólo la alimentación de los datos de este breve script en Python:
import json
import sys
data = json.load(sys.stdin)
data = data[0] # change this to find your string in the JSON
sys.stdout.write(data.encode('utf-8'))
desde donde se puede guardar como foo.py
y llamar como curl ... | foo.py
Un ejemplo que romperá la mayoría de los otros intentos en esta pregunta es "\ud83d\udca3"
:
% printf '"\\ud83d\\udca3"' | python2 -c 'import json, sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'; echo
# echo will result in corrupt output:
% echo -e $(printf '"\\ud83d\\udca3"')
"������"
# native2ascii won't even try (this is correct for its intended use case, however, just not ours):
% printf '"\\ud83d\\udca3"' | native2ascii -encoding utf-8 -reverse
"\ud83d\udca3"
Véase también Unix y Linux: ** [En bash, ¿cómo puedo convertir un punto de código Unicode \ [0-9A-F \] en el personaje printabale?] (Http: // UNIX .stackexchange.com/questions/12273) ** – hippietrail