perl: convierte una cadena a utf-8 para decodificar json
Frecuentes
Visto 17,250 equipos
8
Estoy rastreando un sitio web y recopilando información de su JSON. Los resultados se guardan en un hash. Pero algunas de las páginas me dan el error "carácter UTF-8 mal formado en cadena JSON". Observo que la última letra de "cafe" producirá un error. Creo que es por la mezcla de tipos de personajes. Así que ahora estoy buscando una manera de convertir todos los tipos de caracteres a utf-8 (espero que haya una manera perfecta como esa). Probé utf8::all, simplemente no funciona (tal vez no lo hice bien). Soy un novato. Por favor ayuda, gracias.
ACTUALIZACIÓN
Bueno, después de leer el artículo "Conozca la diferencia entre cadenas de caracteres y cadenas UTF-8Publicado por brian d foy. Resuelvo el problema con los códigos:
use utf8;
use Encode qw(encode_utf8);
use JSON;
my $json_data = qq( { "cat" : "Büster" } );
$json_data = encode_utf8( $json_data );
my $perl_hash = decode_json( $json_data );
Espero que esto ayude a alguien más.
1 Respuestas
24
decode_json
espera que el JSON se haya codificado con UTF-8.
Si bien su archivo fuente está codificado con UTF-8, tiene Perl para decodificarlo con use utf8;
(como deberías). Esto significa que su cadena contiene caracteres Unicode, no los bytes UTF-8 que representan esos caracteres.
Como ha demostrado, puede codificar la cadena antes de pasarla a decode_json
.
use utf8;
use Encode qw( encode_utf8 );
use JSON qw( decode_json );
my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(1)->decode(encode_utf8($data_json));
-or-
my $data = JSON->new->utf8->decode(encode_utf8($data_json));
-or-
my $data = decode_json(encode_utf8($data_json));
Pero simplemente podría decirle a JSON que la cadena ya está decodificada.
use utf8;
use JSON qw( from_json );
my $data_json = qq( { "cat" : "Büster" } );
my $data = JSON->new->utf8(0)->decode($data_json);
-or-
my $data = JSON->new->decode($data_json);
-or-
my $data = from_json($data_json);
Respondido el 18 de Septiembre de 21 a las 14:09
"Pero simplemente podría decirle a JSON que la cadena ya está decodificada". ¿Quiere decir que la entrada de la función de decodificación ya está codificada en utf-8? - ivan wang
La pregunta no tiene sentido. No existe el "es", sólo existe el "debe ser". Si la entrada a $json->decode
debe estar codificado en UTF-8 o no debe estar codificado depende de si está utilizando JSON->new->utf8(1)->decode
(también llamado decode_json
) (la entrada debe ser UTF-8) o JSON->new->utf8(0)->decode
(la entrada debe ser caracteres Unicode). - Ikegami
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas json perl utf-8 or haz tu propia pregunta.
Además, puede mirar lo que sea que esté haciendo su agente de usuario web y decirle que no decodifique el cuerpo. Eso debería darle los octetos sin procesar para que no tenga que codificar lo que decodificó. - brian d foy