2009-08-13 5 views
0

UTF8データをフォームに保存して、mysqlに正しく保存するのに問題があります。特に、私のルビーアプリケーションを介して、私は次のものが含まれ、フォームを投稿しています:RailsアプリからMysqlへのUTF8データの符号化に問題があります

私の端末で、私は、データベースに更新されている参照

Gerhard Tröster

UPDATE `xxxx` SET 
    `updated_at` = '2009-08-13 14:22:33', 
    `description` = '<p><span style=\"font-size: 14px; line-height: normal; white-space: pre; \">Gerhard Tr?ster</span></p>' 
WHERE `id` = 1228 

しかしとき私は、この表から選択することが書かれています:

 
| description | 
--------------- 
| Gerhard Tr | 

注意を単に、インサートを有しているように見えるにもかかわらず、ウムラウトAFTERすべてを切り捨てだことそれ(またはそれのようなもの)が含まれています。

私のdatabase.ymlにはエンコードがUTF8に設定されていますが、HTMLにも適切なMETAタグが含まれています。

+1

私はこれが問題だとは思わないが、引用符でエスケープすると面白いことが起こっている。あなたの値が一重引用符で区切られているときに二重引用符をエスケープするのはなぜですか? –

+0

hmmm ...編集からのようです - 私はJohn Raschの編集で質問がちょっと混乱したかもしれないと思います。 –

+0

@Dominic - ブロック内のすべてをそのまま残してブロック化しました。 –

答えて

1

dbエントリの疑問符は、utf8として正しく更新されていないことを意味します。 dbテーブルとカラムにutf8の照合順序があり、utf8への接続も設定していることを確認する必要があります。あなたがmysqlクエリのSET NAMES 'UTF-8'を使うことができるようにする。

(あなたのDB内のすべてのこのマークアップを保存している理由をさらに私は思ったんだけど?)

+0

ありがとうございました。 ?私はDBに*送られたものを表示しているので、私は端末であると仮定しました。 DBには、疑問符の後には何も含まれていません。 –

+0

DBのマークアップ+1 - リッチテキストとしてユーザー入力を保存するときに唯一のことがわかります –

2

あなたはUTF-8エンコーディングを設定する必要があります(驚くほど)4つの場所がありますが、あなたのデータを確実にするために取得しますmysqlにその形式で保存されています(デフォルトではutf-8を使用しない理由:接続、データベース、テーブル、カラム)。あなたのdatabase.ymlにutf-8を指定すると接続が処理され、他の3つはmysqlに設定する必要があります(caracter set、collat​​e、およびset namesコマンドを使用)。

ちょうど良い尺度のために、あなたのhtml見出しとあなたの環境にutf-8指示文を追加する必要があります。ボード全体に「取る」ことを確認してください。

ここではいくつかの役立つ情報:http://word.wardosworld.com/?p=164

1

これらの問題は、いくつかの可能性のある問題の症状を示します。ほとんどRubyとは関係ありません。

1)あなたのフォームは、UTF-8とは異なるAccept-Charsetで送信されます。

  • フォームから送信されるページは、それ自体ではないUTF-8である場合、これは、メタタグまたはHTTPヘッダー
  • フォーム(ラテン1あろうラテン1ページからフォーム)によって、起こります明示的にはUTF-8
  • 以外のものとして送信されますが、データをポストするためにJavascriptを使用して、正しくエスケープいない、またはユーザーがブラウザがにUnicodeをダウングレードされる可能性があります。この場合、

を行うことを指定しますそれが送ることができる文字セットです。一般的に、フォームの想定されるaccept-charsetは、最初にフォームを表示するページの文字セットです。

2)あなたのMySQLサーバは、データストレージ用にUTF-8を使用することを積極的に妨げるように設定されているため、MySQLはあなたのUTFを何かにダウングレードします(MySQLはすべての接続でSET NAMES SOME_CRAPPY_8BIT_CHARSET_OF_1990、冗談はありません - これは一度私に起こりました)。100%certainity http://www.fngtps.com/2007/02/ruby-and-mysql-encoding-flakiness

3でUTF-8のためにすべてをハードコーディングする方法について説明し、この記事を読んで)あなたが見ているあなたの端末が使用するUTF-8を示し、ラテンまたはASCIIにそれを再コード化しようとすると、ドロップされていません表示することができない文字と "?" (標準パターン)。 $ KCODEを設定したRubyで "puts"ü '"を実行すると、何が表示されますか? Windows端末は、特別な設定が行われる前に、このような動作をする可能性があります。

4)あなたは全くそうはUnicodeの取り扱いを完全

5特別な問題であるルビー1.9)を実行しているが、誰もが知っている:)あなたの文字セットを狂わせるいくつかの安っぽいプロキシソリューションを使用している(または、あなたのホスティング事業者が使用しています送信される入力をヘッダーまたはコード化します。 2と3で約50%のチャンスで賭けることができます。

+0

ありがとうございます。私は上記で参照した同じ端末でこれを試しました: irb(main):001:0> "puts 'ü'"=> "puts '\ 303 \ 274'" そこに出力を見ることができます。 –

0

ルビー自体少しのUnicode対応にするには、この行を必要とする:

$ KCODE = 'U'

私はいつものconfig/environment.rbに

にこのラインを入れて、あなたのデータベースはutf8照合で作成されなければならず、encoding.ymlでUTF8にエンコードされている必要があります。

+0

Railsは、デフォルトでUTF-8/Unicodeを長時間使っています。 $ KCODEを設定する必要はありません。 – molf

1

それは既に上述されたものの:

はdatabase.ymlの中encoding: utf8を置くには、私のためにそれを解決しました。

関連する問題