2009-07-09 8 views
1

(Désolé si une nouvelle question ... J'ai fait pas mal de recherches, honnêtement ...)Comment analyser en toute sécurité les flux multi-octets dans Ruby/Rails?

J'écris du code Ruby on Rails pour analyser les flux RSS/ATOM. Mon code vomit sur un symbole "£" embêtant.

J'ai essayé l'approche de la normalisation et la description des champs titre des aliments avant de faire quoi que ce soit d'autre:

descr = self.description.mb_chars.normalize(:kc) 

Cependant, quand il frappe la corde avec le « £ », je devine que mb_chars rencontre un problème et renvoie un objet Ruby String régulier. Je reçois l'erreur:

undefined method `normalize' for #<String:0x5ef8490> 

Alors quel est le meilleur processus pour préparer de manière défensive ces chaînes pour l'insertion dans la base de données? (J'ai besoin de faire un tas de traitement de chaîne sur eux aussi)

Mon problème est aggravé par le fait que je ne connais pas le format du flux que je suis en train de traiter. Par exemple, j'ai eu un peu de chance avec la ligne suivante:

descr = Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv descr 

Cependant, lorsqu'il rencontre le « £ » il tronque simplement tout après ce point.

Lorsque j'affiche le symbole '£' avec la fonction String.inspect, il s'affiche à '\ 243'. A défaut d'une méthode pour traiter correctement ce symbole, je serais assez heureux pour le remplacer par une autre valeur (comme 'GBP'). Donc, de l'aide avec ce code serait également appréciée.

L'alimentation en question est http://www.dailymail.co.uk/sport/football/index.rss

Répondre

1

je manque quelque chose assez basique -. Je devinais au codage de l'alimentation qui entrait

Alors maintenant, je suis à la recherche (a) charset dans les en-têtes de réponse HTTP, puis (b) le codage dans la déclaration XML dans le flux lui-même.

Une fois le codage utilisé, j'utilise iconv pour le déplacer en UTF-8.

Jusqu'ici tout va bien.

Questions connexes