Non fare affidamento sulle espressioni regolari: JSON presenta alcuni casi angolari con escape \u
e punti di codice non BMP. (in particolare, JSON codificherà un punto di codice usando due escape\u
) Se si presuppone che 1 sequenza di escape si traduca in 1 punto di codice, si è condannati a tale testo.
Utilizzo di un parser completo JSON dalla lingua di vostra scelta è notevolmente più robusta:
$ echo '["foo bar \u0144\n"]' | python -c 'import json, sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'
che è in realtà solo l'alimentazione dei dati a questo breve script 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'))
da cui è possibile salva come foo.py
e chiama come curl ... | foo.py
Un esempio che interromperà la maggior parte degli altri tentativi in questa domanda è "\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"
Vedi anche Unix e Linux: ** [In bash, come posso convertire un Unicode Codepoint \ [0-9A-F \] nel personaggio printabale?] (Http: // unix .stackexchange.com/questions/12273) ** – hippietrail