2

psqlデータベースにツイートに書き込もうとしているときにエラーが発生しました。

私はインターネットの高低(おそらく十分ではない)で答えを検索しましたが、役に立ちませんでした。ここで答えを見てきましたが、提案は文字列をUTF8に変換することでした(応答ヘッダーはすでにUTF-8であると主張していますが)。

私はこのコードでそうしました:

# get the data from twitter
response = RestClient.get "http://search.twitter.com/search.json?rpp=100&since_id=238726971826253824&q=love"

# find the data encoding using CharDet
data = CharDet.detect(response.body)
encoding = data['encoding']

# create a new instance of Iconv with UTF-8 and then convert response.body
ic = Iconv.new('UTF-8//IGNORE', encoding)
converted_response = ic.iconv(response.body + '  ')[0..-2]

# take the data and convert it to JSON
response_json = ActiveSupport::JSON.decode(converted_response)


次に、response_jsonを解析し、データベースの裏側にツイートを作成します。ただし、そうすると、以下のエラーが発生します。

  [4;36;1mSQL (0.1ms)[0m   [0;1mBEGIN[0m
  [4;35;1mSQL (0.0ms)[0m   [0mPG::Error: ERROR: invalid byte sequence for encoding "UTF8": 0xeda0bc
: INSERT INTO "tweets" ("from_user_id", "approved", "from_user", "has_profanity",    "twitter_search_id", "twitter_id", "posted_at", "updated_at", "iso_language_code", "profile_image_url", "text", "created_at", "archived", "geo", "to_user_id", "to_user", "metadata", "source", "event_id") VALUES(573857675, NULL, 'nataliekiro', NULL, 618, 238825898718162944, '2012-08-24 02:31:46.000000', '2012-08-24 02:32:05.166492', 'en', 'http://a0.twimg.com/profile_images/2341785780/image_normal.jpg', 'Happy Birthday @daughternumber1 🎂 Love You 😘', '2012-08-24 02:32:05.166492', 'f', NULL, 0, NULL, 
'--- !map:HashWithIndifferentAccess 
result_type: recent

私は先に進んで、response_json(Hashを返す)のクラスをテストしましたが、そのエラーの最後にHashWithIndifferentAccessと表示されています。

他の誰かが同様の問題を抱えていて、解決策を知っていますか?

ありがとう!

4

1 に答える 1

1

うまくいく解決策を見つけました!Rails / Rubyは初めてなので、これが最良の例かどうかはわかりませんが、少なくとも当面は機能しているようです。

上記の例でわかるように、response.body全体をUTF-8に変換しようとしていました。これは失敗したことが証明されていました。

取得されていたデータを見ると、UTF-8以外のエンティティが含まれている可能性があるのは、ツイートのステータステキストだけです。Twitterでは、表示名にaz、-、_以外の文字を使用できません。また、表示名、ステータステキスト、ツイートIDのみを保存しているため、ステータステキストは残ります。Twitterから取得されたステータスのいくつかを見ると、一部のユーザーはツイート内で絵文字などを使用していました。

私にとっての解決策は、個々のステータステキストをUTF-8に変換してから、ハッシュ内で再割り当てすることでした。

def parse_response!
tweets_json = response_json['results'].reverse rescue []
tweets << tweets_json.collect do |tweet_json|

  # trying to fix encoding issue!
  data = CharDet.detect(tweet_json['text'])
  encoding = data['encoding']
  ic = Iconv.new('UTF-8//IGNORE', encoding)
  converted_response = ic.iconv(tweet_json['text'] + '  ')[0..-2]
  # after converting, put back into value
  tweet_json['text'] = converted_response

  # ... etc

学習プロセスについて話してください!

助けてくれてありがとう@CraigRinger!

于 2012-08-26T03:58:43.680 に答える