Frage

Ich habe eine WebAPI erstellt, dass die Renditen JSON.

die Anfangsdaten ist wie folgt (UTF-8 codiert):

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

Dann mit einem .to_json auf meine Aufgabe, hier ist das, was durch die API gesendet wird (ich glaube, es ISO-8859-1 ist Kodierung):

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

Ich verwende HTTParty auf der Client-Seite, und das ist, was ich endlich bekommen:

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

Sowohl WebAPI und Client-Anwendung werden mit Ruby 1.9.2 und Rails 3.

Ich bin ein bisschen mit dieser Codierung Problem verloren ... Ich habe versucht, die UTF-8-Codierung Header meine ruby-Dateien hinzufügen, aber es hat nichts geändert. Ich denke, dass ich eine Codierung / Decodierung Teil irgendwo bin fehlt ... jemand hat eine Idee?

Vielen Dank !!! Vincent

War es hilfreich?

Lösung

In Ruby 1.9 Codierung ist nun explizit. Jedoch kann Rails oder nicht die Antworten in der Codierung senden Sie erwarten, konfiguriert werden. Sie werden die globalen Konfigurationseinstellung eingestellt haben:

Encoding.default_external = "utf-8".

Ich glaube, die Codierung, dass Ruby legt fest, die standardmäßig für die Serialisierung der Plattform Standard ist. In Amerika auf Windows, das wäre Codepage-1251. Andere Länder würden eine alternative Codierung haben.

Bearbeiten : Auch diese URL sehen, ob die json gegen MySQL ausgeführt werden: https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

Edit 2 : Rails Kern und seine Suite von Bibliotheken (Active, et al..) Die Encoding.default_external Konfigurationseinstellung respektieren, die alle die Werte codiert sendet. Leider, denn Codierung ein relativ neues Konzept Ruby nicht jede 3rd-Party-Bibliothek wurde für die richtige Codierung eingestellt. Diejenigen, die möglicherweise für die Bibliotheken zusätzliche Konfigurationseinstellungen erforderlich. Dazu gehören MySQL, und die RSolr Bibliothek, die Sie verwendet haben.

In allen Versionen von Ruby vor der 1.9-Serie, war ein String nur ein Array von Bytes. Wenn Sie wie das Denken so lange gewesen sind, ist es schwer, den Kopf um das Konzept mehrerer String-Kodierungen zu wickeln. Die Sache, die jetzt noch mehr verwirrend ist, dass im Gegensatz zu Java, C # und anderen Sprachen, die irgendeine Form von UTF wie das native String-Format verwenden, Rubin jeder Saite ermöglicht unterschiedlich codiert werden. Im Nachhinein, dass ein Fehler sein könnte, aber zumindest jetzt sie Codierung respektieren.

Die Encoding.force_encoding Methode entwickelt, um die Byte-Sequenz mit dieser neuen Codierung zu behandeln, aber nicht jeder der zugrunde liegenden Daten ändern. So ist es möglich, ungültige Byte-Sequenzen zu haben. Es gibt eine andere Methode, die die genannte .encode() Bytes von einer Codierung zu einer anderen verändern wird und garantiert gültig Bytesequenzen. Für weitere Informationen lesen Sie:

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

Andere Tipps

Ok, ich fand schließlich heraus, was das Problem ist ...

Ich verwende RSolr auf meine Daten von Solr, und durch Standardcodierung für alle Ergebnisse zu erhalten, ist leider ‚US-ASCII‘, wie hier erwähnt (und geprüft von mir): http://groups.google.com/group/rsolr/browse_thread/thread/ 2d4890fa7737e7ef #

Sie müssen also codieren, wie folgt erzwingen:

my_string.force_encoding(Encoding::UTF_8)

Es ist vielleicht eine nette Codierung Option RSolr bieten!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top