web-dev-qa-db-ja.com

ruby `encode ':" \ xC3 "ASCII-8BITからUTF-8(Encoding :: UndefinedConversionError)

Tvdbのハンニバルエピソードには、奇妙なキャラクターが含まれています。

例えば:

Œuf

Ruby吐き出す:

./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>'

行19は次のとおりです。

puts @tree.to_json

これらの非UTF文字に対処する方法はありますか?私はむしろそれらを置き換えるのではなく、変換しますか?それとも無視しますか?わかりません、どんな助けもありがたいです。

奇妙な部分は、スクリプトがcronを介して正常に動作することです。手動で実行するとエラーが発生します。

32
user796443

オブジェクトには別のエンコーディングを使用する必要があるようです。たとえば、@tree.force_encoding('ISO-8859-1')を使用して ascii-8bit ではなく iso-8859-1 を使用して、変数@treeに適切なコードページを設定する必要があります。 。 ASCII-8BITはバイナリファイルにのみ使用されるためです。

Rubyの現在の外部エンコーディングを見つけるには、次を発行します。

Encoding.default_external

Sudo で問題が解決する場合、問題はデフォルトのコードページ(エンコード)にあったため、解決するには、次のいずれかの方法で適切なデフォルトのコードページ(エンコード)を設定する必要があります。

  1. Rubyでエンコードを tf-8 または別の適切なものに変更するには、次のようにします。

    Encoding.default_external = Encoding::UTF_8
    
  2. bashgrep現在有効なセットアップ:

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

    次に、.bashrcで同様の方法で適切に設定しますが、次のようなru_RU言語では正確に設定しません。

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

File.open(yml_file、 'w')はFile.open(yml_file、 'w b')に変更する必要があります

19
unplugandplay

私は、同様の問題を修正しようとして、何時間も苦しみました。ロケール、データベースエンコード、考えられるすべてをチェックしましたが、データベースからASCII-8BITエンコードデータを取得していました。

バイナリフィールドにテキストを格納すると、ASCII-8BITでエンコードされたテキストとして自動的に返されますが、これは理にかなっていますが、これは(明らかに)アプリケーションで問題を引き起こす可能性があります。

移行時に列エンコードを:textに戻すことで修正できます。

2
Samuel