2009-03-22 8 views
-2

Je suis en train d'insérer du texte provenant de sites Web éraflés dans ma base de données. certains des champs de la chaîne ont des caractères non imprimables/étranges. Par exemple,Rails ActiveRecord: Insertion de texte contenant des caractères non imprimables/étranges

if text is "C__O__?__P__L__E__T__E", 
then the text in the database is stored only as "C__O__" 

Je suis au courant h(), strip_tags() ... aseptiser, ... etc etc, mais je ne veux pas aseptiser ce SQL. L'activationecord enregistre le SQL correctement, et lorsqu'il est exécuté dans phpMySQL, la requête est exécutée correctement. quelque chose se passe entre la génération de la requête SQL et son exécution.

L'aide est très appréciée.

+0

Le? est le caractère de substitution de paramètre; Cela ne devrait se produire que si vous l'utilisez dans votre texte de requête plutôt que comme paramètre. Veuillez modifier votre question pour donner un exemple de ce que vous faites exactement. – womble

+0

Oui, montrez-nous un exemple du code à l'origine du problème. – Gareth

+0

-1 Questions nécessitant des clarifications. Si vous appelez le SQL à l'aide de méthodes de recherche normales, Rails fait un excellent travail en remplaçant le? Si vous injectez manuellement les valeurs dans la requête à l'aide de la chaîne append, cela pourrait poser problème. Les commentaires de Gareth et de womble doivent être adressés. – hyuan

Répondre

0

Hmmmm .. en utilisant l'échappement CGI, j'ai découvert que le caractère arrivant dans le système n'est pas ce que je m'attendais à ce qu'il soit. Ce n'est pas un point d'interrogation (% 3F) mais un point d'interrogation (% D5).

C__%D5__M__P__L__%80___T__%80__ 
C__%3F__M__P__L__%3F___T__%3F__ 

Finalement, je gsubbed les caractères non-imprimables avant d'enregistrer.

gsub(/[^[:print:]]/, '') 

seulement après avoir enlevé les caractères non valides dans ma chaîne, ai-je pu enregistrer l'élément correctement. Aucune des autres solutions n'a fonctionné, en partie parce que le problème n'était pas clairement compris dès le départ.

0

Pouvez-vous échapper le point d'interrogation en utilisant "\?"?

1

Il suffit de remplacer le point d'interrogation dans la chaîne avec une chaîne contenant un point d'interrogation, je n'ai trouvé aucun autre moyen, soit:

[ '? « ? C__O __ __ P__L__E__T__E »,]

œuvres à la perfection.

0

Je sais que c'est très tard, mais j'ai rencontré le même problème lorsque nous essayions de traiter un fichier comme UTF-8 qui utilisait le codage de caractères ISO-8859-1. Je soupçonne que vous avez eu un problème similaire dans votre grattage où vous avez pris le mauvais encodage et il a fini par faire échouer les choses.

Questions connexes