2010-07-09 4 views
3

J'analyse un flux d'entrée provenant de Facebook. J'utilise quelque chose commeUne manière plus élégante de décoder u0000 Unicode dans un flux d'entrée

BufferedReader in = 
    new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 

Et puis in.readLine réellement lire à partir du flux. Le flux semble avoir des caractères Unicode déjà encodés en ASCII, donc je vois des choses comme \ u00e4 (avec en fait deux caractères ASCII discrets). En ce moment, je suis en train de pêcher "\ u" et de décoder les deux octets hexadécimaux suivants, de les transformer en un omble et de remplacer la corde avec eux, ce qui est évidemment la pire façon de le faire.

Je suis sûr qu'il y a une manière cool d'utiliser une fonction native pour décoder les caractères spéciaux pendant la lecture du flux (j'espérais que cela puisse être fait sur le calque InputStreamReader). Mais comment?

+1

Quelle URL analysez-vous, afin que nous puissions voir/vérifier votre saisie? Est-ce JSON, par hasard? – Thanatos

+0

C'est le nouveau système stupide de Facebook avec son API graphique. Ressemble à ceci: {"data": [{"name": "Thanatos", "id": "1234"}, {"name": "Max \ u00e4", "id": "5678" }]} – EboMike

+0

@Thanatos: Oui, c'est, btw. Et l'analyseur JSON le gère correctement. Je suce. – EboMike

Répondre

5

Le format de données est JSON, que je n'ai pas mentionné (et que Thanatos a déjà supposé). L'utilisation de l'analyseur JSON d'Android décode automatiquement les caractères correctement. Parsing JSON vous-même est évidemment une idée stupide à plusieurs niveaux.

2

Si vous voyez « \u00e4 » avec le « \ » et le « u » étant séparé, le « 0 », « 0 », « e » et « 4 » représentent probablement les 4 chiffres hexadécimaux d'un 2 octet (16 bits) Caractère Unicode. La notation est basée sur C99; l'alternative est '\U00XXYYZZ' où il y a 8 chiffres hexadécimaux représentant un caractère UTF-32 32 bits (mais, comme Unicode est un ensemble de 21 bits, les 2 premiers des 8 chiffres sont toujours 0, et le suivant est souvent (habituellement) 0 aussi).

Cependant, cela ne répond pas à votre question sur ce qui est la bonne façon Android de lire les données, et vous avez raison qu'il y en a probablement une.

+0

Ouais, c'est essentiellement 6 octets (bien, physiquement 12 octets, étant donné que c'est dans une chaîne, donc chaque caractère est de 2 octets). Et mon approche fonctionne bien - je l'ai lu comme une valeur de 16 bits et l'utilise comme un caractère. Mais comme je le fais en Java et que je remplace la chaîne au fur et à mesure, il y a des tonnes de surcharges de gestion de mémoire et de JVM. Le faire nativement pendant l'analyse serait infiniment plus rapide. – EboMike

Questions connexes