web-dev-qa-db-fra.com

ruby `encoder ':" \ xC3 "de ASCII-8BIT à UTF-8 (Encoding :: UndefinedConversionError)

Les épisodes de Hannibal dans tvdb contiennent des personnages étranges.

Par exemple:

Œuf

Donc Ruby crache:

./manifesto.rb:19:in `encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
    from ./manifesto.rb:19:in `to_json'
    from ./manifesto.rb:19:in `<main>'

La ligne 19 est:

puts @tree.to_json

Existe-t-il un moyen de gérer ces caractères non utf? Je préfère ne pas les remplacer, mais les convertir? Ou les ignorer? Je ne sais pas, aucune aide appréciée.

La partie étrange est que le script fonctionne bien via cron. L'exécuter manuellement crée une erreur.

32
user796443

Il semble que vous devriez utiliser un autre encodage pour l'objet. Vous devez définir la bonne page de code sur la variable @tree, Par exemple, en utilisant iso-8859-1 au lieu de ascii-8bit en utilisant @tree.force_encoding('ISO-8859-1'). Parce que ASCII-8BIT Est utilisé uniquement pour les fichiers binaires.

Pour trouver l'encodage externe actuel pour Ruby, exécutez:

Encoding.default_external

Si Sudo résout le problème, le problème était dans la page de code par défaut (encodage), donc pour le résoudre, vous devez définir la page de code par défaut (encodage) appropriée, soit:

  1. Dans Ruby pour changer le codage en tf-8 ou un autre bon, procédez comme suit:

    Encoding.default_external = Encoding::UTF_8
    
  2. Dans bash , grep configuration valide actuelle:

    $ Sudo env|grep UTF-8
    LC_ALL=ru_RU.UTF-8
    LANG=ru_RU.UTF-8
    

    Ensuite, définissez-les correctement dans .bashrc, De la même manière, mais pas exactement avec la langue ru_RU, Comme suit:

    export LC_ALL=ru_RU.UTF-8
    export LANG=ru_RU.UTF-8
    

File.open (yml_file, 'w') doit être remplacé par File.open (yml_file, 'w b')

19
unplugandplay

Je viens de souffrir pendant plusieurs heures en essayant de résoudre un problème similaire. J'avais vérifié mes paramètres régionaux, l'encodage de la base de données, tout ce à quoi je pouvais penser et j'obtenais toujours des données encodées ASCII-8BIT à partir de la base de données.

Eh bien, il s'avère que si vous stockez du texte dans un champ binaire, il sera automatiquement renvoyé sous forme de texte codé ASCII-8BIT, ce qui est logique, mais cela peut (évidemment) causer des problèmes dans votre application.

Il peut être corrigé en changeant le codage de la colonne en :text dans vos migrations.

2
Samuel