linux Comment convertir \ uXXXX unicode en UTF-8 en utilisant les outils de la console dans*nix




iconv us-ascii to utf-8 (7)

J'utilise curl pour obtenir une réponse URL, c'est une réponse JSON et il contient des caractères nationaux échappés à l'Unicode comme \u0144 (ń) et \u00f3 (ó) .

Comment puis-je les convertir en UTF-8 ou tout autre encodage pour enregistrer dans le fichier?



Answer #2

Ne comptez pas sur les regex: JSON a des casse-cases étranges avec des \u échappements et des points de code non-BMP. (spécifiquement, JSON codera un point de code en utilisant deux \u échappements) Si vous supposez que 1 séquence d'échappement se traduit par 1 point de code, vous êtes condamné sur un tel texte.

L'utilisation d'un analyseur JSON complet à partir de la langue de votre choix est considérablement plus robuste:

$ echo '["foo bar \u0144\n"]' | python -c 'import json, sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'

Cela ne fait que nourrir les données dans ce court 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'))

D'où vous pouvez enregistrer comme foo.py et appeler comme curl ... | foo.py curl ... | foo.py

Un exemple qui va casser la plupart des autres tentatives dans cette question est "\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"

Answer #3

En supposant que le \u est toujours suivi exactement de 4 chiffres hexadécimaux:

#!/usr/bin/perl

use strict;
use warnings;

binmode(STDOUT, ':utf8');

while (<>) {
    s/\\u([0-9a-fA-F]{4})/chr(hex($1))/eg;
    print;
}

Le binmode place la sortie standard en mode UTF-8. La commande s... remplace chaque occurrence de \u suivie de 4 chiffres hexadécimaux avec le caractère correspondant. Le suffixe e fait que le remplacement est évalué en tant qu'expression plutôt que traité comme une chaîne; le g dit de remplacer toutes les occurrences plutôt que la première.

Vous pouvez enregistrer ce qui précède dans un fichier quelque part dans votre $PATH (n'oubliez pas le chmod +x ). Il filtre l'entrée standard (ou un ou plusieurs fichiers nommés sur la ligne de commande) vers la sortie standard.


Answer #4

Fonctionne sur Windows, devrait fonctionner sur * nix aussi. Utilise python 2.

#!/usr/bin/env python
from __future__ import unicode_literals
import sys
import json
import codecs

def unescape_json(fname_in, fname_out):
    with file(fname_in, 'rb') as fin:
        js = json.load(fin)
    with codecs.open(fname_out, 'wb', 'utf-8') as fout:
        json.dump(js, fout, ensure_ascii=False)

def usage():
    print "Converts all \\uXXXX codes in json into utf-8"
    print "Usage: .py infile outfile"
    sys.exit(1)

def main():
    try:
        fname_in, fname_out = sys.argv[1:]
    except Exception:
        usage()

    unescape_json(fname_in, fname_out)
    print "Done."

if __name__ == '__main__':
    main()

Answer #5

Je ne sais pas quelle distribution vous utilisez, mais uni2ascii devrait être inclus.

$ sudo apt-get install uni2ascii

Cela dépend seulement de libc6, donc c'est une solution légère (uni2ascii i386 4.18-2 est 55,0 kB sur Ubuntu)!

Ensuite pour l'utiliser:

$ echo 'Character 1: \u0144, Character 2: \u00f3' | ascii2uni -a U -q
Character 1: ń, Character 2: ó

Answer #6
iconv -f Unicode fullOrders.csv > fullOrders-utf8.csv

Answer #7

Peut-être un peu moche, mais echo -e devrait le faire:

echo -en "$(curl $URL)"

-e interprète les échappements, -n supprime normalement l' echo la nouvelle ligne.

Note: L'échappement \u fonctionne dans le bash builtin echo , mais pas /usr/bin/echo .

Comme indiqué dans les commentaires, il s'agit de bash 4.2+, et 4.2.x ont un bogue gérant les valeurs 0x00ff / 17 (0x80-0xff).







encoding