2009-11-22 1 views
7

Ich erhalte den folgenden Fehler mit meinem Ruby 1.9 & Rails 2.3.4. Dies geschieht, wenn der Benutzer ein Nicht-ASCII-Standardzeichen übermittelt.inkompatible Zeichencodierungen: ASCII-8BIT und UTF-8 in Ruby 1.9

Ich lese viele Online-Ressourcen, aber keine scheint eine Lösung zu haben, die funktioniert.

ich versucht, mit (wie einige Ressourcen vorgeschlagen)

string.force_encoding('utf-8') 

aber es hat nicht geholfen.

Irgendwelche Ideen, wie man das löst? Gibt es eine Möglichkeit, solche Zeichen vor dem Speichern in der Datenbank zu löschen? Oder gibt es eine Möglichkeit, sie zu zeigen?

+4

Es gibt eine gute Post darüber auf Yehuda Katz Blog: http: // yehudakatz.com/2010/05/17/encodings-unabridged/ – makevoid

+0

Ich habe damit eine Weile gekämpft. Mysql2 Juwel hat nicht funktioniert, noch irgendeine der anderen Lösungen, die vorgeschlagen wurden. Für andere Sucher, die darüber stolpern könnten: Wenn Sie blob oder einen anderen Datentyp in mysql verwenden, ändern Sie ihn in string oder text. Es behält Kodierung und keine Kopfschmerzen mehr. –

Antwort

1

Ich weiß nicht viel über Ruby (oder Rails), aber ich stelle mir vor, dass das Problem durch mangelnde Kontrolle über Ihre Zeichenkodierungen verursacht wird.

Zuerst sollten Sie entscheiden, welche Kodierung Sie in Ihrer Datenbank speichern. Dann müssen Sie sicherstellen, dass der gesamte Text in diese Codierung konvertiert wird, bevor Sie in der Datenbank gespeichert werden. Um das zu tun, müssen Sie zuerst wissen, mit welcher Codierung es beginnen soll.

Ein oft wiederholter Ratschlag besteht darin, alle Eingaben von der Codierung, die sie verwendet, zu Unicode (wenn Ihre Sprache dies unterstützt) so schnell wie möglich zu dekodieren, nachdem Sie die Kontrolle darüber erlangt haben. Dann wissen Sie, dass der gesamte Text, den Sie in Ihrem Programm behandeln, Unicode ist. Kodieren Sie den Text auf der anderen Seite, bevor Sie ihn ausgeben, als letzten Schritt.

Der Schlüssel ist immer zu wissen, welche Kodierung ein Stück Text an einer beliebigen Stelle in Ihrem Code verwendet.

10

Verwenden Sie für Ruby 1.9 und Rails 3.0.x den Adapter mysql2.

In Ihrem gemfile:

gem 'mysql2', '~> 0.2.7' 

und aktualisieren Sie Ihre database.yml zu:

adapter: mysql2 

http://www.rorra.com.ar/2010/07/30/rails-3-mysql-and-utf-8/

+1

Danke, das hat super für mich funktioniert. Aber seien Sie gewarnt, dass mysql2 v0.3. * Fehler mit Rails 3.0.7 wirft. http://StackOverflow.com/Questions/3467054/Problem-with-Mysql2-and-rails3-bundler – aNoble

+1

Ich kämpfte mit den 'inkompatiblen Zeichenkodierungen: ASCII-8BIT und UTF-8' bei der Verwendung von' Rack-Webconsole' - Dann habe ich diesen Beitrag gefunden. Danke, @Jony Fung! –