1

JSON を返す WebAPI を作成しました。

初期データは次のとおりです (UTF-8 エンコード)。

@text="Rosenborg har ikke h\xC3\xB8rt hva Steffen"

次に、オブジェクトに .to_json を使用すると、API によって送信されるものが次のようになります (ISO-8859-1 エンコーディングだと思います)。

"text":"Rosenborg har ikke h\ufffd\ufffdrt hva Steffen"

私はクライアント側で HTTParty を使用していますが、それが最終的に得られるものです:

"text":"Rosenborg har ikke h��rt hva"

WebAPI とクライアント アプリはどちらも Ruby 1.9.2 と Rails 3 を使用しています。

このエンコーディングの問題で少し迷っています... utf8エンコーディングヘッダーをRubyファイルに追加しようとしましたが、何も変わりませんでした。どこかでエンコード/デコードの部分が欠けていると思います...誰かアイデアがありますか?

どうもありがとうございました !!!ヴィンセント

4

2 に答える 2

1

Ruby 1.9 では、エンコーディングが明示的になりました。ただし、Rails は、期待するエンコーディングで応答を送信するように構成されている場合とされていない場合があります。グローバル構成設定を設定する必要があります。

Encoding.default_external = "utf-8".

Ruby がシリアライゼーションのためにデフォルトで指定するエンコーディングは、プラットフォームのデフォルトだと思います。Windows 上のアメリカでは CodePage-1251 になります。他の国では別のエンコーディングがあります。

編集: json が MySQL に対して実行される場合は、この URL も参照してください: https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

編集 2 : Rails コアとそのライブラリ スイート (ActiveRecord など) は、送信するすべての値をエンコードする Encoding.default_external 構成設定を尊重します。残念ながら、エンコーディングは Ruby にとって比較的新しい概念であるため、すべてのサードパーティ ライブラリが適切なエンコーディング用に調整されているわけではありません。これらのライブラリには、追加の構成設定が必要になる場合があります。これには、MySQL と、使用していた RSolr ライブラリが含まれます。

1.9 シリーズより前のすべてのバージョンの Ruby では、文字列は単なるバイト配列でした。長い間そのように考えてきた場合、複数の文字列エンコーディングの概念を理解するのは困難です。さらにややこしいのは、ネイティブ文字列形式として何らかの形式の UTF を使用する Java、C#、およびその他の言語とは異なり、Ruby では各文字列を別々にエンコードできることです。振り返ってみると、それは間違いかもしれませんが、少なくとも今はエンコーディングを尊重しています。

このEncoding.force_encodingメソッドは、その新しいエンコーディングでバイト シーケンスを処理するように設計されていますが、基になるデータは変更しません。そのため、無効なバイト シーケンスが存在する可能性があります。.encode()バイトをあるエンコーディングから別のエンコーディングに変換し、有効なバイト シーケンスを保証する別のメソッドが呼び出されます。詳細については、これをお読みください:

http://blog.grayproductions.net/articles/ruby_19s_string

于 2010-11-10T17:28:23.507 に答える
1

わかりました、ようやく問題が何であるかがわかりました...

私はSolrからデータを取得するために RSolr を使用しています。デフォルトでは、すべての結果のエンコードは残念ながら「US-ASCII」です。 ブラウズ_スレッド/スレッド/2d4890fa7737e7ef#

したがって、次のようにエンコードを強制する必要があります。

my_string.force_encoding(Encoding::UTF_8)

RSolr に提供する素敵なエンコード オプションがあるかもしれません!

于 2010-11-11T08:49:28.610 に答える